2016-02-17 92 views
0

我在一個父控制器中對三個不同的指令,並試圖向一個事件向孩子們(指令的控制器)進行廣播。

我在父控制器中嘗試了以下操作,但無效。

$scope.$on('tracking', function(e, data){ 
    //set it to open by default since that is the default case. 
    if($scope.switchBackToOpen === undefined) { 
     $scope.switchBackToOpen = true; 
    } 
    $scope.switchBackToOpen = data; 
    $scope.$broadcast('switch back', $scope.switchBackToOpen); 
    }); 

因爲這沒有工作,我沒有在我的指令的控制器下面,而不是傾聽上面的廣播:

vm.func = function(){ 
     if($scope.$parent.switchBackToOpen) { 
     //communicate with a sibling directive 
     $scope.$root.$broadcast('set status back to open'); 
     } 

    }; 

如果$broadcast是不可能的$on什麼是最裏面角度的方式來解決這個問題?

編輯父母/子女關係的更多的結構:

當一個div被點擊一個嵌套的指令,我想起來傳達給父控制器來捕捉這是否是「打開」頁面或不通過父控制器內的變量。然後,我想從這個父控制器發送變量,讓所有嵌套的指令都可以訪問它(我的第二塊代碼是我想要訪問父控制器變量的指令)。

+0

這看起來像是在範圍數據模型中使用原語而不是使用對象的最佳做法的醜陋竅門。顯示更多家長/孩子的結構。指令是否使用隔離範圍? – charlietfl

+0

您可以使用服務或工廠在您的控制器和指令之間進行通信 – Ronnie

+0

謝謝@charlietfl我已更新以獲取更多詳細信息。基本上尋找一種不必使用$ parent的方法,如果可能的話,通過事件來完成。 – devdropper87

回答

1

您不希望廣播一個事件通過範圍傳播並被父母抓住。相反,你會喜歡把父變量綁定到子指令。即使您的指令有隔離範圍,您也可以這樣做。

讓我們假設你的HTML是這樣的:

<div ng-controller='parentCtrl'> 
    <div my-child dirclick='childEvent'> 

    </div> 
    <div my-child dirclick='childEvent'> 

    </div> 
</div> 

你parentCtrl是這樣的:

.controller('parentCtrl',function($scope){ 
    $scope.childEvent = function(){ 
    //some code 
    } 
}) 

所以,你的指令應該是這樣的:

.directive('myChild',function(){ 
    return { 
    template : "<button ng-click='clickme()'>clickme</button>", 
    scope : {clickme : '=dirclick'}, 
    restrict : 'A', 

(我有沒有寫完整的代碼的指令,所以等待它)

現在無論寫在你的子指令的dirclick屬性中,它都會綁定到parentCtrl的名爲childEvent的對象。它將被綁定到你的指令的clickme。現在,您可以從您的子指令的clickme()fn調用parentCtrl的childEvent()函數。 (我很難解釋,更好地看下面的代碼)

你很想現在做任何廣播。所以,你申報的parentCtrl childEvent()FN是這樣的:

$scope.childEvent = function(){ 
    $scope.$broadcast('child event',{say:"hello"}); 
} 

而且這樣定義你的孩子指令的控制器:

controller : function($scope){ 
    $scope.$on('child event',function(event,data){ 
    alert(data.say); 
    }); 
} 

這可以幫助你解決你的問題。

請查找相關小提琴:https://jsfiddle.net/Lo7ehrdn/1/

建議 - 不玩多以$廣播,因爲它從頂部到所有的子作用域下降。如果繪製一棵樹,其根目錄是父範圍,那麼廣播將運行到所有最後的葉子。

希望這會有所幫助。

+0

這是一個非常詳細的解釋,並有助於鞏固指令的核心概念,謝謝! – devdropper87

+0

歡迎您:) –