角度控制器As(this)相当于$ scope。$ broadcast和$ scope.on,

时间:2016-07-06 11:59:42

标签: angularjs

根据这个答案我只想要从控制器到另一个的火灾事件

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,只是控制器和此。有一种方法可以在不注入范围的情况下触发事件?或者我应该注入$ scope吗?但我在另一个答案中读到,使用范围和控制器是不好的做法。

2 个答案:

答案 0 :(得分:1)

如果未在控制器中注入$emit$broadcast,则无法注册$scope$rootScope事件。

使用$scope变量和函数确实是不好的做法,因为控制器的实例已经使用$scope语法注入controllerAs

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

但是,您不应仅使用$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);

答案 1 :(得分:0)

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