$ on仅在一个控制器上调用

时间:2014-12-16 03:15:12

标签: angularjs angularjs-scope

我有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')在历史记录页面和仪表板页面上多次被调用。我无法弄清楚为什么它会将视图更改回仪表板,但

1 个答案:

答案 0 :(得分:1)

我不确定我是否完全掌握了您的问题,但我最好的猜测是您遇到了加载订单问题,并且在订阅初始化之前正在广播该活动。


首先,为了省去很多麻烦,重要的是要对Event Handling in AnguarJS有充分的了解:

  • 知道订阅$ rootScope。$ on vs $范围。$上
  • 知道发布与$ broadcast vs $ emit的区别 $ rootScope vs $ scope

从评论中听起来你可能一直在使用$ rootScope。$ on,当你的控制器被销毁时(与指令相同),它不会被清除:

var changeSafeListnerUnbindFunction = $rootScope.$on('changeSafe', funciton() { //... });

$scope.$on('$destroy', changeSafeListnerUnbindFunction);

根据您的用例,在子范围上注册侦听器将获取从$ rootScope发布的事件。$ broadcast(将顶级级别传递到每个子范围)。 您可能有加载订单问题吗?