如何在Angular DART控制器之间进行通信

时间:2014-03-03 16:02:23

标签: dart 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 - 我甚至尝试改为&#34; value(LogsController,new LogsController())&#34 ;,但它是相同的 - 它在新的MyAppModule调用时创建新的LogsController,然后新的另一个模板我想。我显然做错了 - 但是文档没有用,而且angularjs似乎根本不相似。

更新: 想象一下两个表(控制者) - 用户和日志,每个用户行都有链接显示分配给他的日志。

3 个答案:

答案 0 :(得分:9)

使用最新的AngularDart库(0.10.0),GünterZöchbauer的解决方案仍然正确,但语法有所改变:

// 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");

答案 1 :(得分:8)

你可以使用
* 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 + mouseclick 导航到doc注释以获取更多信息。

答案 2 :(得分:1)

我没有完全听从您的问题,您是否可以包含整个代码以便更好地理解。

以下是一个示例,可能会回答您的问题: https://github.com/angular/angular.dart/issues/264