Angular 2 хранит классы компонентов в обслуживании

0

Я хочу создать службу, в которой хранится объект угловых компонентов. Эта служба в основном будет иметь компоненты свойств, которые будут выглядеть как {key: componentClass}.

Это кажется довольно простым в реализации, и на самом деле это так, но я столкнулся с одной проблемой, и я не знаю, как ее решить.

Позволяет вызвать службу ComponentStoreService. В качестве примера это может выглядеть так:

@Injectable()
export class ComponentStoreService {
 components: { [key: string]: any; } = {};

   register(key: string, components: any): void {
     this.components[key] = components;
   }

   getByKey(key: string): any {
     return this.components[key];
   }

   getAll(): any {
     return this.components;
   }
}

и теперь давайте создадим 2 демонстрационных компонента и сохраним их:

const providers = ReflectiveInjector.resolve([ComponentStoreService]);
const injector = ReflectiveInjector.fromResolvedProviders(providers);
const componentStore= injector.get(ComponentStoreService );

@Component({
  selector: 'component-1',
  template: '<h2>component-1</h2>'
})
export class D1Component {constructor() {}}

componentStore.register('component-1', D1Component );

console.log('component-1 called', componentStore.getAll())

Второй:

    const providers = ReflectiveInjector.resolve([ComponentStoreService]);
    const injector = ReflectiveInjector.fromResolvedProviders(providers);
    const componentStore= injector.get(ComponentStoreService );

    @Component({
      selector: 'component-2',
      template: '<h2>component-2</h2>'
    })
    export class D2Component {constructor() {}}

    componentStore.register('component-2', D2Component );

    console.log('component-2 called', componentStore.getAll())

И в результате сначала console.log печатает объект, в который добавлен первый компонент. Это нормально. И второй console.log печатает только второй компонент. Это неверно.

Насколько я понял в каждом компоненте ComponentStoreService - отдельный экземпляр. Как я могу сделать это singleton в целом приложении? Я регистрирую ComponentStoreService только на уровне приложения. Это означает, что проблема в другом месте. Может быть, потому, что я вызываю службу вне класса компонентов.

  • 0
    То, что вы получаете, является правильным для этого кода: вы создаете два инжектора, поэтому вы получаете отдельные экземпляры того, что зарегистрировано в них. Реальный вопрос - какой цели вы пытаетесь достичь этим? Это не кажется правильным. На мой взгляд, такая механика не нужна.
  • 0
    Мне нужно реализовать функциональность , которая позволяет показывать только те компоненты , от componentId , которые хранятся в config.json . Поэтому я подумал, что возможно есть объект с { key: componentClass } в котором хранятся все компоненты. Это дало бы возможность извлекать компоненты по ключу и отображать только те компоненты, Ids которых хранятся в config.json .
Показать ещё 2 комментария
Теги:
angular
angular2-services

1 ответ

1

Ваш ComponentStoreService является глобальной службой. Потому что вы используете эту услугу в нескольких компонентах. Вы можете вводить ее 1 раз, когда приложение загружено. Так вы можете использовать ее повсюду.

bootstrap(AppComponent, [ComponentStoreService]);

компонент 1:

    @Component({
      selector: 'component-1',
      template: '<h2>component-1</h2>'
    })
    export class D1Component {constructor(private _componentStoreService:ComponentStoreService) {}}

    componentStore.register('component-1', D1Component );

    console.log('component-1 called', this._componentStoreService.getAll())

component2

        @Component({
          selector: 'component-2',
          template: '<h2>component-2</h2>'
        })
        export class D2Component {constructor(private _componentStoreService:ComponentStoreService) {}}

        componentStore.register('component-2', D2Component );

        console.log('component-2 called', this._componentStoreService.getAll())

вы можете использовать поставщиков для внедрения ComponentStoreService.

  • 1
    Вы должны знать, что таким образом каждый компонент получает свой собственный ComponentStoreService . Если вы хотите поделиться службой, вы должны предоставить ее общему родителю - например, AppComponent .
  • 0
    Да, просто используйте ComponentStoreService в свойстве providers только корневого компонента и внедрите его в каждый компонент, который вы хотите зарегистрировать. stackoverflow.com/questions/34929665/...
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню