$rootScope.$broadcast在ui router中没有被捕捉到。
$rootScope.$broadcast在ui router中没有被捕捉到。
我正在使用ui-router显示两个ui-view,一个嵌套在另一个中。它们的组织如下所示:\n
.state('itemAbstract', { url: '/items', abstract: true, templateUrl: 'client/views/item.ng.html', controller: 'moveCtrl', }) .state('item', { url: "/:itemId", parent: "itemsAbstract", views: { "otherpage":{ templateUrl: 'client/views/other-page.ng.html', controller: 'otherPageCtrl' } } })
\n当点击某个项目时,我在\"otherpage\"控制器中运行以下代码:\n
$rootScope.$broadcast("somethingClicked",obj)
\n我尝试在\"item\"控制器中监听此事件:\n
$scope.$on("somethingClicked",function(a,b){ console.log(a) console.log(b); })
\n不幸的是,该函数从未被调用过。我尝试将此监听函数放在\"otherpage\"控制器中,当事件发生时,它被正确调用。但出于某种原因,这个广播没有在作用域之间传递。这正是我使用它的原因,当父级中的某个内容被点击时触发父级中的某个动作。对于为什么不起作用,有什么想法吗?\n以下是我为项目编写的控制器:\n
angular.module('mm').controller('itemCtrl', function($scope, $meteor, $rootScope, $state, $stateParams) { var s = $scope; s.rs = $rootScope; $scope.$on("somethingClicked",function(a,b){ console.log("there as a click") console.log(a) console.log(b); }) })
\n我使用Batarang进行调试,发现尽管有这段代码,但$scope甚至没有注册事件监听器。`$scope.$$listeners`中没有somethingClicked事件的监听器。非常奇怪,这不合理为什么不起作用。
问题的出现原因是因为可能存在没有应用继承的独立控制器。在视图中嵌套控制器可以简单地声明$scope上的继承关系。在这种情况下,可以使用$rootscope来广播或监听事件:
//ctrl1 $rootScope.$broadcast("somethingClicked",obj); //ctrl2 $rootScope.$on("somethingClicked",function(a,b){ console.log(a) console.log(b); });
在Stack Overflow上有一个相关问题的简单演示和一个较旧的问题。
根据您的示例代码,我使用$rootscope进行通信没有任何问题。
状态声明使用一个抽象的父控制器和一个映射到视图中的子控制器:
$stateProvider .state('test', { url: '/test', controller: 'pctrl', views: { 'main': { template: '{{test}}' + '' } } }) .state('test.child', { url: '/test/child', controller: 'cctrl', views: { 'childview': { template: '' } } });
这里是一个完整的工作示例。
我已经尝试过了!不幸的是它不起作用。我将$rootscope注入到控制器中,但仍然没有任何反应!我认为这与我的ui-router实现有关。
这太复杂了...如果我搞不明白,我会尝试发布一些东西。奇怪的是,这段代码:coderwall.com/p/h72qlg/…在我运行它时没有显示已触发事件。
好吧,我简化了控制器和实际控制器代码到我的问题!