根据这个答案我只想要从控制器到另一个的火灾事件
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吗?但我在另一个答案中读到,使用范围和控制器是不好的做法。
答案 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,为什么不将事件处理的逻辑移动到服务?