检查是否已经设置了监听器
Check if a listener is already set
我在服务中添加一个监听器如下:
app.service('hostService', ['$rootScope', function ($rootScope) {
this.addListener = function () {
console.log("addListener")
$rootScope.$on("messageFromSiteToHost", function (event, data) {
action(data);
})
}
然后我意识到hostService.addListener
被用户多次调用,结果当有messageFromSiteToHost
的消息时,action(data)
被多次调用。
有谁知道是否有办法检查 $rootScope.$on("messageFromSiteToHost"
是否已设置(无需在服务中使用辅助变量)。如果已经设置好了,我不想再添加监听器了。
框架中没有任何可用于检查现有事件侦听器的内容。
您能解释一下您要求不使用 "an auxiliary variable in the service" 的原因吗?
为什么不能在函数周围加个守卫?:
app.service('hostService', ['$rootScope', function ($rootScope) {
var listenerAdded = false;
this.addListener = function () {
if (listenerAdded){
return;
}
listenerAdded = true;
console.log("addListener")
$rootScope.$on("messageFromSiteToHost", function (event, data) {
action(data);
})
}
}]);
此外,如果您发现需要在整个应用程序中经常执行此操作,那么您可以概括实现或使用类似 lodash.once
的方法来删除样板文件:
app.service('hostService', ['$rootScope', function ($rootScope) {
this.addListener = _.once(function () {
console.log("addListener")
$rootScope.$on("messageFromSiteToHost", function (event, data) {
action(data);
})
});
}]);
我在服务中添加一个监听器如下:
app.service('hostService', ['$rootScope', function ($rootScope) {
this.addListener = function () {
console.log("addListener")
$rootScope.$on("messageFromSiteToHost", function (event, data) {
action(data);
})
}
然后我意识到hostService.addListener
被用户多次调用,结果当有messageFromSiteToHost
的消息时,action(data)
被多次调用。
有谁知道是否有办法检查 $rootScope.$on("messageFromSiteToHost"
是否已设置(无需在服务中使用辅助变量)。如果已经设置好了,我不想再添加监听器了。
框架中没有任何可用于检查现有事件侦听器的内容。
您能解释一下您要求不使用 "an auxiliary variable in the service" 的原因吗?
为什么不能在函数周围加个守卫?:
app.service('hostService', ['$rootScope', function ($rootScope) {
var listenerAdded = false;
this.addListener = function () {
if (listenerAdded){
return;
}
listenerAdded = true;
console.log("addListener")
$rootScope.$on("messageFromSiteToHost", function (event, data) {
action(data);
})
}
}]);
此外,如果您发现需要在整个应用程序中经常执行此操作,那么您可以概括实现或使用类似 lodash.once
的方法来删除样板文件:
app.service('hostService', ['$rootScope', function ($rootScope) {
this.addListener = _.once(function () {
console.log("addListener")
$rootScope.$on("messageFromSiteToHost", function (event, data) {
action(data);
})
});
}]);