$rootScope.$broadcast在ui router中没有被捕捉到。

15 浏览
0 Comments

$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事件的监听器。非常奇怪,这不合理为什么不起作用。

0
0 Comments

问题出现的原因是我错误配置了路由文件,并且在加载页面时指定了错误的控制器。这就是为什么我的所有事件监听器都没有注册的原因!

解决方法是将路由文件的配置更正为正确的控制器。

0
0 Comments

问题的出现原因是因为可能存在没有应用继承的独立控制器。在视图中嵌套控制器可以简单地声明$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/…在我运行它时没有显示已触发事件。

好吧,我简化了控制器和实际控制器代码到我的问题!

0