簡體   English   中英

$ rootScope。$ broadcast未在ui路由器中接收

[英]$rootScope.$broadcast not picked up in ui router

我正在使用ui-router顯示2個ui視圖,一個在另一個視圖中。 它們的組織方式如下:

.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'
        }
    }
})

單擊項目時,我在otherpage控制器中運行以下操作。

$rootScope.$broadcast("somethingClicked",obj)

我嘗試在item控制器中監聽事件:

$scope.$on("somethingClicked",function(a,b){
    console.log(a)
    console.log(b);
})

不幸的是,這個函數永遠不會被調用。 我試着將此偵聽器函數放在otherpage控制器中,並在事件發生時正確調用了它。 但是,由於某種原因,該廣播不會跨示波器傳輸。 這就是我使用它的全部原因,當單擊父級中的某項時觸發父級中的操作。 有什么想法為什么不起作用?

這是我的項目負責人

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);
    })
}

我使用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: '<div ng-controller="pctrl">{{test}}</div>' +
                '<div ui-view="childview"></div>'
            }
          }
        })
        .state('test.child', {
          url: '/test/child',
          controller: 'cctrl',
          views: {
            'childview': {
              template: '<div ng-controller="cctrl" />'
            }
          }
        });

這是一個完整的工作演示

找到答案-我錯誤地配置了路由文件,並且為我正在加載的頁面指定了錯誤的控制器。 這就是為什么我的事件監聽器都沒有注冊的原因!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM