Я хочу создать службу, в которой хранится объект угловых компонентов. Эта служба в основном будет иметь компоненты свойств, которые будут выглядеть как {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
только на уровне приложения. Это означает, что проблема в другом месте. Может быть, потому, что я вызываю службу вне класса компонентов.
Ваш 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.
ComponentStoreService
. Если вы хотите поделиться службой, вы должны предоставить ее общему родителю - например, AppComponent
.
ComponentStoreService
в свойстве providers
только корневого компонента и внедрите его в каждый компонент, который вы хотите зарегистрировать. stackoverflow.com/questions/34929665/...
componentId
, которые хранятся вconfig.json
. Поэтому я подумал, что возможно есть объект с{ key: componentClass }
в котором хранятся все компоненты. Это дало бы возможность извлекать компоненты по ключу и отображать только те компоненты,Ids
которых хранятся вconfig.json
.