2016-02-09 79 views
1

有沒有辦法讓$發送給直接父控制器?

我有不同的控制器,每個控制器使用兒童分頁指令,看起來像這樣。

.directive('pagination', function() { 
return { 
    restrict: 'E', 
    templateUrl: '/Views/Shared/_Pagination.html', 
    scope: { pagination: "=pagination" }, 
    controller: ['$scope', function ($scope) { 
     $scope.$watch('pagination.Page', function (newVal, oldVal) { 
      $scope.$emit('pageChanged', { page: newVal }); 
     }); 
    }] 
} 

當您更改頁面控制器,分頁指令將父控制器趕上,和父控制器HTTPGET得到另一個頁面發送消息。

問題是:如果我有控制器A,其中包含子控制器B,它們都使用分頁。並且,當控制器B上的頁面發生更改時,控制器B和A都會捕獲該消息,因爲A是B的父代。因此,是否有辦法僅將消息發送給最直接的父代B,因爲我已更改頁面在控制器B.

或者,如果我設計這個錯誤..請給一些輸入了。謝謝!

+0

你可以在$ emit中發送額外的參數,並在兩個控制器中決定它屬於哪個 –

+0

@NechemyaKanelsky你能舉個例子嗎?我將發送什麼樣的參數?我不想對此進行硬編碼,因爲這種情況將在整個應用程序中使用。我想讓它變成模塊化。 – andyh0316

+0

,所以你可以根據你所有的控制器在你的directice控制器裏面進行切換,然後爲每個控制器使用自定義的$ emit。或者根據當前的URL進行一些主控制器/服務器內的所有重定向,並將其映射到那裏 –

回答

3

回答你的問題

你父控制器裏面你可以使用

event.stopPropagation() 

這將使當前監聽節點來處理該事件,但任何後續的聽衆將不會收到它進行處理。

stopPropagation - {function =}:調用stopPropagation函數將取消進一步的事件傳播(僅適用於$ emit-ed的事件)。

一個更好的辦法

因爲你基本上是使用在給定的特定事件的回調模式,一條指令將調用傳遞給它的功能,那麼你可以使用你的指令的範圍回調錶達。

{ 
    scope: { pageChanged: '&' }, 
    link: function($scope, elem, attrs){ 
     //somewhere you trigger your pageChanged logic then fire this 
     $scope.pageChanged({ $page: newVal }) 
    } 
} 

您的指令聲明

<div pagination page-changed="parentControllerFunc($page)"> 

這比使用$emit因爲你基本上試圖betw溝通更角度十歲上下。一個指令和一些視圖的控制器,其中指令駐留在其中。使用角度爲$emit/$broadcast的API更適用於嘗試通過事件總線進行通信,在這種事件總線中,組成成員可能更直接地瞭解或無法彼此通信。

相關問題