【问题标题】:How to communicate between Angular DART controllers如何在 Angular DART 控制器之间进行通信
【发布时间】:2014-03-03 16:02:22
【问题描述】:

我有两个控制器,想在它们之间“发送”对象。我有这样的事情:

@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 - 我什至尝试更改为“value(LogsController, new LogsController())”,但它相同 - 它创建当新的 MyAppModule 调用时新的 LogsController,然后我猜想为模板创建另一个新的 LogsController。我显然做错了 - 但文档没有帮助,而且 angularjs 似乎根本不相似。

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

【问题讨论】:

    标签: dart angular-dart


    【解决方案1】:

    使用最新的 AngularDart 库 (0.10.0),Günter 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");
    

    【讨论】:

      【解决方案2】:

      你可以使用
      * 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 cmets 以获取更多信息。

      【讨论】:

      • 我在 js 和 angularjs 中没有背景,有没有示例如何在 angular dart 中使用它?
      【解决方案3】:

      我没有完全理解您的问题,您能否将整个代码包含在内以便更好地理解。

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

      【讨论】:

      • 我想创建独立服务会起作用,但是……恕我直言,这似乎过于复杂了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 2013-08-31
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      • 2016-04-14
      • 2018-11-06
      相关资源
      最近更新 更多