【问题标题】:angular controllerAs(this) equivalent of $scope.$broadcast and $scope.on,角度控制器As(this) 相当于 $scope.$broadcast 和 $scope.on,
【发布时间】:2016-07-06 11:59:42
【问题描述】:

根据这个答案,我只想从控制器到另一个触发事件

Call a method of a controller from another controller using 'scope' in AngularJS

$scope.$on("myEvent", function (event, args) {
   $scope.rest_id = args.username;
   $scope.getMainCategories();
});

而在第二个控制器中,您只需这样做

$scope.initRestId = function(){
   $scope.$broadcast("myEvent", {username: $scope.user.username });
};

但我在我的应用程序中没有使用 $scope,只使用了 controllerAs 和 this。有一种方法可以在不注入范围的情况下触发事件?或者我应该注入 $scope 吗?但我在另一个答案中读到同时使用 scope 和 controllerAs 是不好的做法。

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    如果没有将$scope$rootScope 注入控制器,则无法注册$emit$broadcast 事件。

    使用$scope 变量和函数确实是一种不好的做法,因为您的控制器实例已经通过controllerAs 语法注入到$scope 中。

    但是如果你想使用这些事件,除了注入作用域对象之外别无选择。

    但是,您不应仅使用 $emit$broadcast 事件来共享数据。这些事件用于应用程序范围的信息(如用户已登录或注销...等)

    使用角度事件的一个好习惯是首选$rootScope.$emit,因为$scope 依赖于组件的层次结构。

    例如:

    $scope.$emit 将发射到父组件。

    $scope.$broadcast 将广播给子组件。

    然后$rootScope.$broadcast 会将事件广播到 rootScope 以及作用域(这可能会让你的代码很快变得混乱)

    $rootScope.$emit 是首选,因为它注册了事件应用程序范围并使其仅可用于 rootScope。 ($rootScope.$on)

    另一个好的做法是取消绑定您的自定义事件。 每当卸载/销毁组件或指令时,事件侦听器仍将驻留在 rootScope 内,从而可能导致内存泄漏。

    解除绑定事件:

    var unbind = $rootScope.$on('logout', function(event, data) {
        console.log('LOGOUT', data);
    });
    $scope.$on('$destroy', unbind);
    

    【讨论】:

      【解决方案2】:

      我认为通常过度使用 $broadcast 和 $emit 也是一种不好的做法。如果不想使用 $scope,为什么不将事件处理的逻辑移到服务中呢?

      【讨论】:

      • 我使用服务,但无论如何,当 view2 的 MyController2 正在更改状态时,我希望 MyController1 更新以刷新 view1。并且 Controller2 不知道服务值的变化,除非我使用 $watch 或 $broadcast 来触发事件,所以我回到我的问题:p
      猜你喜欢
      • 2015-02-28
      • 2016-01-15
      • 2016-02-19
      • 2017-05-02
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      相关资源
      最近更新 更多