2014-11-08 44 views
1

我有一個變量數組(我將其稱爲ArrVar),它可通過服務提供給所有控制器。該變量已被指定爲範圍變量CtrlA as $ scope.ArrVar。如果用戶在CtrlA下切換按鈕,則附加到CtrlA的方法將更改爲$ scope.ArrVar,更新服務中的變量並使用ng-repeat顯示列表。控制器間共享範​​圍變量的最佳做法是什麼?

但我有一個完全獨立的控制器,CTRLB,這需要做下CTRLA,這是不可訪問從CTRLB變化範圍變量。

我能想到的兩種解決方案:

  1. 全局控制器
  2. 在根範圍

分配變量,但兩種方法似乎並沒有成爲最佳實踐。有沒有其他優雅的方式呢?兩個控制器完全不同,所以合併不會。

+0

我想大多數人通常與SharedServices去。在這個網站上有幾個關於他們的問題。 – dckuehn 2014-11-08 05:38:14

+0

但服務不允許更新範圍變量。 CtrlB可以通過使用該服務來接收最新更新的ArrVar,但它無法訪問$ scope.ArrVar,它在CtrlA – Jas 2014-11-08 05:42:47

+0

的範圍內您可以更新屬於共享服務的變量,並觀察該變量從一個控制器。當該值改變時,CtrlB可以執行一個動作,更新由CtrlA監視的另一個sharedService變量,然後觸發另一個動作。 – dckuehn 2014-11-08 05:44:32

回答

1

如果您共享特定於obj (如元素位置data.msg)的數據,它將與服務綁定而不觀看任何內容或任何內容。

2 controllers plunker

app.controller('FirstCtrl', function($scope, Shared) { 
    $scope.data = Shared; 
}) 
.controller('SecondCtrl', function($scope, Shared) { 
    $scope.data = Shared; 
}) 
.factory('Shared', function() { 
    return { msg : ['one','two','three'] } 
}); 

    <div ng-controller="FirstCtrl"> 
     <input ng-model="data.msg"/> 
     {{data}} 
    </div>  
    <div ng-controller="SecondCtrl"> 
     <input ng-model="data.msg"/> 
    {{data}} 
    </div> 
+0

謝謝Dylan,但我已經嘗試了這種方法,但是陣列沒有立即更新。實際上,每個函數調用之間都有一個延遲,所以前面的函數調用結果被傳遞給作用域...(這可能是因爲在新函數完成之前,作用域變量被更新)我試過了運行$ scope。$手動應用,但我得到一個錯誤,說它已經在進行中。我不得不使用$超時爲了防止它的工作。有沒有其他方式,然後超時? – Jas 2014-11-09 22:30:06

+0

如果您正在等待某個事件完成,那麼該控制器可能需要$ watch,但這不應該破壞2的初始綁定。如果沒有示例,可能會出現一個重擊者,這很難說。 – Dylan 2014-11-09 22:43:54

+0

我終於明白了。簡而言之,服務中的ArrVar在API調用中進行了更新,因此我必須使用$ apply來進行即時更新。非常感謝! – Jas 2014-11-10 08:45:59

相關問題