Как предоставить данные в конструкторе службы?

#angular

#angular

Вопрос:

Существует служба Angular:

 @Injectable()
export class SortService {
  constructor(private sortField = "date", private sortDirection = true) {}
}
 

Я зарегистрировал эту службу в разделе поставщиков модулей.

Как передать значения по умолчанию в конструктор?

Я получаю это сообщение сейчас:

ошибка ncaught: не удается разрешить все параметры для SortService: (?, ?).

Комментарии:

1. Это инъекционный сервис, который управляется Angular. Вы бы никогда не «создали» этот класс самостоятельно, поскольку он управляется с помощью внедрения зависимостей Angular. Если вам нужен «обычный» класс, для которого вы можете создавать свои собственные экземпляры, просто удалите вводимый декоратор. Это часто не имеет смысла, хотя для сервисов вам обычно нужны синглеты.

2. Итак, после удаления вводимого декоратора, как его использовать? Нравится новый A() ? в компоненте?

Ответ №1:

Вы можете выбрать любой из этих 3 методов:

1.) Установите значения по умолчанию с помощью экземпляра частной переменной

 @Injectable()
export class SortService {

  // default values and private fields only accessible in this service
  private sortField = "date";
  private sortDirection = true;

  constructor() {}

  // If later you want to update the sort config 
  setSortConfig(field: string, direction: boolean): void {
     this.sortField = field;
     this.sortDirection = direction;
  }

}
 

2.) Установите значения по умолчанию внутри поставщиков модуля

Модуль

 @NgModule({
   ...,
   providers: [
     { 
        provide: 'sortConfig',     // you can also integrate InjectionToken on this
        useValue: { sortField: 'date', sortDirection: true } 
     }
   ]
})
 

— Вы можете получить к нему доступ через Component или Service

Компонент

 import { Inject } from '@angular/core';

@Component({...})
export class TestComponent {

   constructor(@Inject('sortConfig') private sortConfig: any) {}

}
 

Обслуживание

 @Injectable()
export class SortService {

   constructor(@Inject('sortConfig') private sortConfig: any) {}

}
 

3.) Установите значения по умолчанию с помощью Service Factory (Your case)

Создали демонстрационную версию Stackblitz для этого примера:

Модуль

 @NgModule({
   ...,
   providers: [
      // Upon loading this particular service inside the module, 
      // any component under this module that utilizes SortService 
      // will run as expected with the default values supplied below
      { 
         provide: SortService, 
         useFactory: () => new SortService('date', true)
      }

   ]
})
 

Обслуживание

 @Injectable()
export class SortService {

  constructor(
     private sortField,
     private sortDirection
  ) {}
}
 

Комментарии:

1. Почему этот @Inject('sortConfig') private sortConfig: any внутренний компонент не находится внутри конструктора службы?

2. Я до сих пор не понимаю, почему мы вводим его внутри компонента вместо сервиса, это нужно только сервису

3. Привет, Алиса, ты можешь внедрить компонент или сервис. Вы можете выбрать любой из двух вариантов, где вы хотите использовать данные 🙂 Обновили приведенный выше пример для метода # 2

Ответ №2:

Вы написали инъекционную службу. Эта ошибка была вызвана из-за @Injectable() .

  • Удалить @Injectable()
  • Используйте new ключевое слово при инициализации класса сервиса.

app.component.ts

  export class AppComponent {
  private myServices: SortService;
  constructor() {
    this.myServices = new SortService("date", false);
  }
 }
 

Проверьте внедрение угловой зависимости: https://angular.io/guide/dependency-injection

Ответ №3:

Вот пример:

 import {Injectable} from "@angular/core";

@Injectable()
export class dataBaseService{

serviceData: string = "default value unset";

getData():string{
    return this.serviceData;
}

setData(value:string){
  this.serviceData = value;
}
}