Angularjs $broadcast到当前作用域 序言,我有一个通过网络套接字连接到节点服务器的离子应用程序,节点服务器通过TCP套接字连接到C++应用程序。我有一个服务,它连接并为套接字提供服务,但也监视nack响应,以便它可以发出警报,通知用户错误: (function(){ 'use strict'; angular.module('tacoCorp.services') .factory('Socket', Socket); Socket.$inject = ['socketFactory', 'OSDP', '$rootScope']; function Socket(socketFactory, OSDP, $rootScope) { var socket = io('localhost:3000'); socket = socketFactory({ioSocket: socket}); socket.on('connect', function() { console.log('connected'); }); socket.on('nack', function(data) { console.log(data); var error = OSDP.parse(data); $rootScope.$broadcast('nack', error); }); return socket; } }());
我在每个控制器中都有此功能,以便它可以发出弹出窗口:Angularjs $broadcast到当前作用域 序言,我有一个通过网络套接字连接到节点服务器的离子应用程序,节点服务器通过TCP套接字连接到C++应用程序。我有一个服务,它连接并为套接字提供服务,但也监视nack响应,以便它可以发出警报,通知用户错误: (function(){ 'use strict'; angular.module('tacoCorp.services') .factory('Socket', Socket); Socket.$inject = ['socketFactory', 'OSDP', '$rootScope']; function Socket(socketFactory, OSDP, $rootScope) { var socket = io('localhost:3000'); socket = socketFactory({ioSocket: socket}); socket.on('connect', function() { console.log('connected'); }); socket.on('nack', function(data) { console.log(data); var error = OSDP.parse(data); $rootScope.$broadcast('nack', error); }); return socket; } }());,angularjs,ionic-framework,Angularjs,Ionic Framework,我在每个控制器中都有此功能,以便它可以发出弹出窗口: $scope.$on('nack', function(e, err) { console.log(err); var alertPopup = $ionicPopup.alert({ title: 'Error', template: err.error }); }); 我的问题是,即使每个状态/视图只有一个控制器,它也会多次触发。几乎
$scope.$on('nack', function(e, err) {
console.log(err);
var alertPopup = $ionicPopup.alert({
title: 'Error',
template: err.error
});
});
我的问题是,即使每个状态/视图只有一个控制器,它也会多次触发。几乎就好像$destroy
没有发生或者没有删除侦听器一样。如果我这样做,仍然会发生:
var nackListener = $scope.$on('nack', function(e, err) {
console.log(e);
var alertPopup = $ionicPopup.alert({
title: 'Error',
template: err.error
});
});
$scope.$on('$destroy', nackListener);
我不确定处理此问题的最佳方法是什么。正如所指出的$ionicConfigProvider.views.maxCache(0)
修复了此问题,而状态上的cache:false
没有。您也可以这样做:
$scope.$on("$ionicView.afterLeave", function () {
$ionicHistory.clearCache();
});
对我来说,最好的方法就是选择一个控制器来安装它,然后使用它。创建另一个函数,在$destroy上调用该函数,该函数将控制台输出一条测试消息,并调用您的cancel函数。这将告诉您您的控制器至少已被破坏。请更改此处讨论的缓存策略。或者钩住IONIC触发的事件,这是缓存@RadimKöhler的一个解决方法。我可以看到有
$ionicView.Left
,但是如何在不销毁的情况下删除侦听器?你所要做的就是将函数传递给$scope.$on('$ionicView.Left')
,然后Angle神奇地删除侦听器?我会说,您只需从缓存视图中删除它。例如:$scope.$on(“$ionicView.leave”,nackListener)
。。。。这不是神奇的。根本没有魔法。这是关于这样一个事实:1)当触发事件$ionicView.leave时-2)调用REMOVE方法nackListener 3)因为nackListener是REMOVE WATCH方法的引用。。。没有魔法