2014-01-16 104 views
0

試圖將我在AngularJS中的理解指令提升到一個新的水平。我讀過這本書並取得了很大的進展,但這讓我感到很難過。我認爲我還缺少一點關鍵的理解。獲取AngularJS指令更新

假設我有兩個指令。指令是並排的,不是嵌套在一起的。他們不以任何方式分享範圍(我知道)。兩個指令都注入相同的服務。點擊指令#1中的項目時,點擊處理程序會調用服務上的一項功能,該功能會改變指令#2應對之服務內的某些內容。例如,假設我有一個「註銷」指令和一個「我的賬戶」指令。點擊「註銷」後,我想讓「我的帳戶」指令變暗,或者也許文本更改爲「請登錄」。 「註銷」指令調用myService.logout(),「我的賬戶」指令範圍可能綁定到myservice.someObj.isLoggedIn()。點擊發生時,isLoggedIn()函數開始返回false。

我怎樣才能得到第二個指令知道發生了什麼事?在發生重大變化時,我可以在指令中觸發一個函數調用嗎?我如何設置指令的範圍來做到這一點?

謝謝!

+0

如果你想幫助寫作,改變,修復,調試或者使用代碼做任何其他事情,請張貼您正在使用的實際代碼,但請不要嘗試未經測試的「示例」或僞代碼。 – Stewie

回答

1

Logout指令,可以使用$scope.$emit到消息LOGOUT_TRIGGERED傳遞給父範圍。

在父範圍內,使用$scope.$on來收聽該消息。收到該消息後,只需通過$scope.$broadcast將消息HANDLE_LOGOUT發送至Account指令。

Account指令中,再次使用$scope.$on來收聽那個HANDLE_LOGOUT消息。

  • $scope.$emit發送消息給所有的家長範圍
  • $scope.$broadcast發送消息給所有子作用域

或者你可以檢查此EventDispatcher服務: https://github.com/trochette/Angular-Design-Patterns-Best-Practices/blob/master/js/base/EventDispatcher.js

2

在您的指令中,您可以使用「我的帳戶」按鈕觀看服務以進行更改。你只需要做一個

$scope.$watch(mysevice.someObj.isLoggedIn, function() { 

    //do something 

}) 

另外,您也可以有第一個按鈕$scope.$broadcast一旦其退出,並有使用$scope.$on該廣播的第二服務手錶。

UPDATE

app.directive('directiveName', function() { 
    restrict: 'AE', 
    link: function ($scope, element, attrs){ 
     $scope.$watch(myservice.someObj.isLoggedIn, function() { 
      // do stuff 
     } 
    } 
}); 
+0

你能告訴我應該在指令中設置範圍嗎? 我正在嘗試它的範圍:真,迄今似乎沒有工作。我嘗試在$ watch函數中記錄到控制檯,並且我只看到它被首先加載的指令調用,即使我確實正在改變正在觀察的內容。 –

+1

您也可以使用'$ scope。$ broadcast'或$ $ scope。$同樣的方式。確保你也將服務注入指令。 – SkyOut

+0

$ rootScope。$ broadcast()和$ rootScope。$上完美工作,似乎是最直接的,但也許有使用$ rootScope我不知道的壞。這些看起來都是實現相同目標的不同方法:及時更新範圍。我很想找到一種技術與另一種技術的設計權衡的概述。 –