我有controller
,其中有一个名为changeSafe
的事件。我希望其他控制器在此事件被触发时监听
secure.controller('wrapperCtrl', function ($scope, $rootScope, storeFactory, safeFactory) {
$scope.changeSafe = function (safeId) {
$scope.loading = true;
safeFactory.setSafe(safeId).then(function (safeData) {
$scope.safe = safeData;
$scope.loading = false;
$rootScope.$broadcast('changeSafe', safeData);
});
}
});
加载的第一个页面称为dashboard
,当我添加页面下方的内容时,使用$ scope.safe重新绘制的内容正如我所期望的那样。
secure.controller('dashboardCtrl', function ($scope, $rootScope, storeFactory, safeFactory) {
$scope.$on('changeSafe', function (event, arg) {
bindSafe(arg.safeId);
});
});
我的历史记录控制器上几乎完全相同
secure.controller('historyCtrl', function($scope, $rootScope, storeFactory, safeFactory) {
$scope.$on('changeSafe', function (event, arg) {
bindHistory(arg.safeId);
});
});
我在config
部分
secure.config(['$routeProvider', function ($routeProvider) {
$routeProvider
.when('/history', {
templateUrl: '/Angular/History/history.html',
controller: 'historyCtrl'
})
.otherwise({
templateUrl: '/Angular/Dashboard/dashboard.html',
controller: 'dashboardCtrl'
});
}]);
每当我点击wrapperCtrl
内仅按$scope.$on
dashboardCtrl
次点击内的按钮时。任何人都可以看到为什么$scope.$on
没有被historyCtrl
控制器触发?我还不清楚为什么当我不在那个视图时从dashboardCtrl
调用它。
当我单步执行代码时,我实际上看到$rootScope.$on('changeSafe')
在历史记录页面和仪表板页面上多次被调用。我无法弄清楚为什么它会将视图更改回仪表板,但
答案 0 :(得分:1)
我不确定我是否完全掌握了您的问题,但我最好的猜测是您遇到了加载订单问题,并且在订阅初始化之前正在广播该活动。
首先,为了省去很多麻烦,重要的是要对Event Handling in AnguarJS有充分的了解:
从评论中听起来你可能一直在使用$ rootScope。$ on,当你的控制器被销毁时(与指令相同),它不会被清除:
var changeSafeListnerUnbindFunction = $rootScope.$on('changeSafe', funciton() { //... });
$scope.$on('$destroy', changeSafeListnerUnbindFunction);
根据您的用例,在子范围上注册侦听器将获取从$ rootScope发布的事件。$ broadcast(将顶级级别传递到每个子范围)。 您可能有加载订单问题吗?