Если два разных компонента находятся в одном и том же представлении (ngRoute), как они могут использовать общий объект или обмениваться данными?

В AngularDart у меня есть представление.

https://angulardart.org/tutorial/08-ch06-view.html

'demo_table': ngRoute(
path: '/demo/table',
view: 'views/demotable.html'
),

На представлении у меня есть две составляющие.

<component1 view-string="Component 1"></component1>
<component2 view-string="Component 2"></component1>

Я хотел бы, чтобы строка просмотра была экземпляром строки, которая может быть изменена либо компонентом 1, либо компонентом 2. Изменения должны отразиться на отображении строки в компоненте.

Я не понимаю, как сохранить строку в этом представлении, так как это представление не является компонентом. Обычно я использовал бы "{{someString}}" в строке представления, если бы это представление действительно было компонентом с объектом дротика.


person Phil    schedule 07.06.2014    source источник


Ответы (3)


Один из способов решить проблему и по-прежнему использовать компоненты вместо контроллеров — ввести класс, содержащий ваши общие данные. На самом деле, это точно так же работает и с контроллерами, но это спорный вопрос, потому что контроллеры, похоже, исчезают, как упоминал Рэндал.

(Прошу прощения за опечатки или ошибки — я печатаю прямо в текстовом редакторе, поэтому это может не скомпилироваться.)

Шаг 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

Решение, которое я нашел, заключается в использовании контроллера, на мой взгляд, у меня может быть {{ctrl.test}} для просмотра строки контроллеров.

Контроллер.

library some_library;

import 'package:angular/angular.dart';

@Controller(
    selector: '[some-controller]',
    publishAs: 'ctrl')
class SomeController {
  @NgTwoWay("test")
  String test = "TEST";
}

В представлении добавьте контроллер.

<div teacher-controller> etc...
person Phil    schedule 07.06.2014
comment
Конечно, контроллеры устарели… интересное обсуждение в списке рассылки по этому поводу. - person Randal Schwartz; 07.06.2014
comment
Итак, что мне делать, если я не могу использовать контроллер? - person Phil; 08.06.2014
comment
Могу ли я иметь родительский контроллер на странице, который хранит данные и как-то ссылается между ними?... Я так запутался. - person Phil; 08.06.2014

Ответ Грега Шермана с использованием MySharedClass верен, но отсутствует аннотация @Injectable(). Вам понадобится что-то вроде этого:

import 'package:angular/angular.dart';

@Injectable()
class MySharedClass {
  String mySharedVariable;
}
person Wilson Yeung    schedule 15.01.2015