Как общаться между контроллерами Angular DART

у меня есть два контроллера и я хочу "отправить" между ними объект. У меня есть что-то вроде этого:

@NgController(selector: '[users]', publishAs: 'ctrl')
class UsersController {
  List<Users> users;
}

@NgController(selector: '[user_logs]', publishAs: 'ctrl')
class LogsController {
  List<Log> logs;
  void filterLogsFor(User user) { logs = ... }
}

class MyAppModule extends Module {
  MyAppModule() {
    type(LogsController);
    type(UserController);
  }
}

Мое решение заключалось в том, чтобы просто добавить LogsController в UserController в качестве зависимости и вызвать что-то вроде ctrl.logsCtrl.filterLogsFor(user) из шаблона. Но по какой-то причине это не сработает - я обнаружил, что DI создает еще один новый объект LogController, который не связан с самим шаблоном - я даже пытался изменить на "значение (LogsController, новый LogsController())", но то же самое - он создает новый LogsController, когда вызывается новый MyAppModule, а затем, я думаю, новый еще один для шаблона. Я явно делаю что-то не так, но документация бесполезна, и angularjs кажется совсем не похожим.

ОБНОВЛЕНИЕ: представьте себе две таблицы (контроллеры) - пользователи и журналы, каждая строка пользователя имеет ссылку для отображения назначенных ему журналов.


person user2216697    schedule 03.03.2014    source источник


Ответы (3)


С новейшей библиотекой AngularDart (0.10.0) решение Гюнтера Цохбауэра по-прежнему верно, но синтаксис немного изменился:

// Receiver
//import 'dart:async';
String name;
Scope scope;
ReceiverConstructor(this.scope) {
  Stream mystream = scope.on('username-change');
  mystream.listen(myCallback);
}

void myCallback(ScopeEvent e) {
  this.name = e.data;
}


// Sender
scope.emit("username-change", "emit");
scope.broadcast("username-change", "broadcast");
scope.parentScope.broadcast("username-change", "parent-broadcast");
scope.rootScope.broadcast("username-change", "root-broadcast");
person Patrick B Kelley    schedule 20.04.2014

Вы можете использовать
* scope.$emit
* scope.$broadcast
* scope.$on

Решение @grohjy также может работать, в зависимости от ваших требований.

Scope scope;
UserController(this.scope) { // get access to the scope by adding it to the constructor parameter list
  // sender
  scope.$emit('my-event-name', [someData, someOtherData]); // propagate towards root
  scope.$broadcast('my-event-name', [someData, someOtherData]); // propagate towards leaf nodes (children)
  scope.$parent.$broadcast('my-event-name', [someData, someOtherData]); // send to parents childs (includes silblings children)
  scope.$root.$broadcast('my-event-name', [someData, someOtherData]); // propagate towards leaf nodes starting from root (all nodes)

  // receiver
  scope.$on('my-event-name', (ScopeEvent e) => myCallback(e)); // call myCallback when an `my-event-name` event reaches me
}

просто напишите scope.$emit (или один из других методов) и ctrl+щелчок мыши, чтобы перейти к комментариям к документу и получить дополнительную информацию.

person Günter Zöchbauer    schedule 03.03.2014
comment
У меня нет опыта работы с js и angularjs, есть ли пример, как использовать это в угловом дротике? - person user2216697; 03.03.2014

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

Вот один пример, который может ответить на ваш вопрос: https://github.com/angular/angular.dart/issues/264

person grohjy    schedule 03.03.2014
comment
Я думаю, что создание независимого сервиса будет работать, но... имхо кажется, что это слишком усложняет простую вещь. - person user2216697; 03.03.2014