2014-03-03 57 views
4

我有两个控制器并希望在它们之间“发送”对象。我有这样的事情:如何在角度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(用户)。但它不会因为某种原因而工作 - 我发现DI创建了另一个新的对象LogController,它与模板本身无关 - 我甚至尝试更改为“value(LogsController,new LogsController())”,但它相同 - 它创建新的LogsController,当新的MyAppModule调用,然后新的另一个模板我猜。我显然做错了 - 但文档没有帮助,而且angularjs似乎根本不相似。

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

回答

9

随着最新AngularDart库(0.10.0),君特Zö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"); 
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 +点击鼠标导航到该文档注释,以获取更多信息。

+0

我没有js和angularjs的背景,有没有例子如何使用角度飞镖? – user2216697

+0

我扩展了我的答案 –

+0

谢谢,它会工作! – user2216697

相关问题