Angular2 Разрешить компонентам и их подкомпонентам доступ к одному экземпляру ngModel в службе

Я создаю сложный вид с большим количеством функций. Чтобы все было организовано, я разбил его на несколько пользовательских компонентов.

Я постараюсь быть кратким, поскольку у меня это работает, но я не могу представить, что это «правильный путь».

Структура:

- AppComponent(has binding to dataModel)
--LayoutComponent
---HeaderComponent
---SideMenuComponent
---MainContentComponent

Мне нужно иметь возможность предоставить каждому из этих компонентов доступ к одному и тому же экземпляру модели данных. Но когда я добавляю службу в качестве поставщика и в конструктор в каждом компоненте, он генерирует новый экземпляр данных. Таким образом, изменения, сделанные в одном компоненте, не отразятся на данных другого.

Итак, что я сделал, так это дал доступ самому верхнему родительскому компоненту AppComponent к модели данных, а затем передал его по цепочке через шаблон [(dataModel)]="dataModel".

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

Это работает, поскольку я могу привязать входные данные в каждом компоненте к одному и тому же полю, например dataModel.name, и когда я его обновляю, все компоненты отражают изменение.

Это просто не похоже на чистый способ сделать это. Любая помощь будет оценена по достоинству.


person Rob    schedule 26.09.2016    source источник
comment
Это больше похоже на проверку кода. Кроме того, поскольку вы предоставляете нам только свою структуру, большинство ваших тегов не применяются.   -  person David Archibald    schedule 27.09.2016
comment
До версии rc5 вы могли просто предоставить службу провайдеру родительского компонента, и вы могли получить доступ к одному и тому же экземпляру этой службы повсюду под ним. От rc5 до final вы можете добавить службу в AppModule, чтобы сделать ее единственной во всем приложении.   -  person Harry Ninh    schedule 27.09.2016
comment
@HarryNinh хорошо, я этого не пробовал. Если я добавлю его в AppModule, добавлю ли я его в свой конструктор в подкомпонентах, например (datamodelservice:DataModelService)?   -  person Rob    schedule 27.09.2016
comment
Да, вам все еще нужно добавить его в свой конструктор (чтобы иметь ссылку на экземпляр службы).   -  person Harry Ninh    schedule 27.09.2016
comment
Это сработало. Очень признателен   -  person Rob    schedule 27.09.2016


Ответы (1)


Если вы добавите службу к поставщикам каждого компонента, каждый компонент получит свой собственный экземпляр службы. Angular2 DI поддерживает один экземпляр для каждого провайдера.

Если вы добавите его в провайдеры комментария-предка, то этот компонент и все потомки получат экземпляр от этого провайдера.

В >= RC.5, если вы добавите службу в providers: [...] любого @NgModule(...), который не лениво загружен, он будет добавлен в качестве провайдера к корневому инжектору и, следовательно, будет использоваться совместно со всем приложением (до тех пор, пока любой компонентов-потомков также имеет его в качестве поставщика, который переопределяет его для своих потомков).

Для модулей с отложенной загрузкой поставщики совместно используются в этом модуле с отложенной загрузкой, потому что модули с отложенной загрузкой имеют собственную дочернюю область DI.

person Günter Zöchbauer    schedule 27.09.2016
comment
Хорошее объяснение. - person Rob; 28.09.2016