我正在开发一个AngularJs项目。我有一个服务,用于设置和删除一些按钮上的事件。另外一个服务利用了这个服务,但我不希望直接与按钮交互。然而,当按钮被单击时,我想要将点击事件过滤到第一个服务中,并在第二个服务中处理。由于我不希望第二个服务知道这些按钮的存在,所以我打算在第一个服务中创建一个自定义事件。如何创建自定义事件并在按钮被点击时触发它?
谢谢提前。
我正在开发一个AngularJs项目。我有一个服务,用于设置和删除一些按钮上的事件。另外一个服务利用了这个服务,但我不希望直接与按钮交互。然而,当按钮被单击时,我想要将点击事件过滤到第一个服务中,并在第二个服务中处理。由于我不希望第二个服务知道这些按钮的存在,所以我打算在第一个服务中创建一个自定义事件。如何创建自定义事件并在按钮被点击时触发它?
谢谢提前。
broadcast
:$rootScope.$broadcast('buttonPressedEvent');
然后像这样接收它:
$rootScope.$on('buttonPressedEvent', function () {
//do stuff
})
$scope.$on
更改为$rootScope.$on
即可。 - Chancho$rootscope.$broadcast()
欢呼! - rinogo任何基于全局作用域的集成都会损害命名空间,并可能导致中大型应用程序发生可怕的副作用。我建议使用代理服务,这个解决方案略微复杂但绝对更为清晰。
1. 创建代理服务
angular.module('app').service('userClickingHelper', [
function() {
var listeners = [];
return {
click: function(args) {
listeners.forEach(function(cb) {
cb(args);
});
},
register: function(callback) {
listeners.push(callback);
}
};
}
]);
2. 创建一个按钮指令,该指令使用userClickingHelper作为依赖项。
angular.module('app').directive('onDistributedClick', ['userClickingHelper', function (userClickingHelper) {
return {
restrict: 'A',
link: function (scope, element) {
element.on('click', userClickingHelper.click);
}
};
}]);
3. 使用代理注册您的非关联服务。
angular.module('app').service('myUnrelatedService', [function (userClickingHelper) {
userClickingHelper.register(function(){
console.log("The button is clicked somewhere");
});
}]);
这个结果是一个独立的事件分配范围,然而指令和服务彼此不知道。这也更容易进行单元测试。
我正在使用类似的解决方案来全局访问“加载”模态框,以便我可以抽象出控制器/服务告诉“用户现在不应该点击或执行任何操作”的方式。
ng-click="$emit('customEvent')"
$rootScope.$on('customEvent', function(){
// do something
})
$rootScope.$broadcast()
更合适,但我能理解,在某些情况下,使用 ng-click="$emit('customEvent')"
会更好。 - rinogo