Как каждый раз создавать новый экземпляр службы в Angular?

Например, можно реализовать что-то вроде шаблона «Команда». Использование Injector.get по-прежнему возвращает экземпляр синглтона, так что это не сработает.

Отредактировано для пояснения, потому что временные поставщики, предложенные в комментарии и ответе, - это не то, что мне нужно: новые экземпляры необходимо создавать ad hoc, во время взаимодействия с приложением, например, при нажатии кнопки, а не при создании экземпляра компонента. В экземпляр могут быть внедрены другие службы Angular. Это связано с тем, что мы используем шаблон команды для функции отмены/повтора. Например:

@Injectable()
export class MyCommand extends Command{

constructor(private someService: SomeService)
{

}

public execute{
  const value = this.someService.getSomeValue();
  //doSomethingWithValue
}
}

Отвечает ли это на ваш вопрос? angular 2 временных провайдера вместо синглтона

Daniel Gimenez 25.04.2024 21:47
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
1
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот класс команды, экземпляр которого каждый раз хотелось бы создавать заново. Обратите внимание, что вам придется каждый раз создавать новый editCommandInjector, иначе он вернет тот же экземпляр, что и раньше.


@Injectable()
export class EditCommand{
    constructor(private someService: SomeService, private someOtherService: SomeOtherService)
    {
    }
}

В вашем компоненте (или службе), где вы хотите каждый раз создавать экземпляр нового экземпляра команды, вы можете сделать следующее:

import { Component, Injector, inject } from '@angular/core';

@Component({
  selector: 'app-my-component',
  templateUrl: './my-component.component.html',
})
export class MyComponent{

  private injector = inject(Injector);

  constructor() {
  }

  onSomeButtonClicked(){
       const editCommandInjector = Injector.create({ providers: [EditCommand], parent: this.injector });
       const command = editCommandInjector.get(EditCommand);
   }
}

Вы можете просто настроить поставщика для своего класса обслуживания в декораторе компонентов, например

@компонент({ ..., поставщики: [ServiceClass] })

Или

Выполните эту конфигурацию везде, где вы вводите этот класс.

Другие вопросы по теме