Один из способов решить проблему и по-прежнему использовать компоненты вместо контроллеров — ввести класс, содержащий ваши общие данные. На самом деле, это точно так же работает и с контроллерами, но это спорный вопрос, потому что контроллеры, похоже, исчезают, как упоминал Рэндал.
(Прошу прощения за опечатки или ошибки — я печатаю прямо в текстовом редакторе, поэтому это может не скомпилироваться.)
Шаг 1. Представьте общий класс, аннотируйте его как Injectable:
@Injectable()
class MySharedClass
{
String mySharedVariable;
}
Шаг 2. Убедитесь, что этот Angular может внедрить класс, сообщив об этом Angular:
class MyInitModule extends Module {
MyInitModule() {
// Your bindings ...
// Your components, controllers are bound for Angular's DI
// This is the important part:
bind(MySharedClass);
// Typical Angular.Dart bindings:
bind(RouteInitializerFn, toValue: yourRouteInitializer);
bind(NgRoutingUsePushState, toFactory: (_) =>
new NgRoutingUsePushState.value(false));
}
main() {
applicationFactory().addModule(new MyInitModule()).run();
}
Шаг 3. Теперь добавьте общий класс в конструкторы ваших компонентов. Angular автоматически внедрит экземпляр, если вы объявите для него требование:
@Component(
selector: 'componentA',
templateUrl: 'correct_path', // insert correct value here.
publishAs: 'cmp')
class ComponentA {
MySharedClass sharedClass;
ComponentA(this.sharedClass) {
}
@Component(
selector: 'componentB',
templateUrl: 'correct_path', // insert correct value here.
publishAs: 'cmp')
class ComponentB {
MySharedClass sharedClass;
ComponentB(this.sharedClass) {
}
И теперь у вас есть доступ к вашему общему классу между двумя (или более) компонентами, как вы считаете нужным.
(Изменено Уилсоном Йенгом для добавления аннотации Injectable())
person
Greg Sherman
schedule
09.06.2014