2014-02-13 60 views
0

我有一個控制器和一個指令。在指令中有來自控制器的數據數組。 當點擊指令中的按鈕時,我希望控制器更新數據。 因此,按鈕被點擊,我顯示一個繁忙的指標,當控制器完成更新數據時,我想隱藏忙指標。我的問題是有些時候數據保持不變,所以「watchCollection」函數沒有被觸發。底線,我正在尋找一種解決方案,將允許控制器告訴指令,他已完成更新。角度 - 檢測更改爲相同的值

**我想到的另一個解決方案是爲「更新」添加布爾值。該指令會將其更改爲true,並在控制器完成時將其更改爲false。但問題再次是,在某些情況下,在摘要週期開始之前,「更新」的值會變回false,檢測到已更改爲true。

該指令看起來是這樣的:

指令:

{ 
scope: { 
     arrayData: "=", 
     onChangeData: "&" 
}, 

controller: function($scope){ 
    $scope.buttonClicked : function(){ 
     // show busy indicator 
     $scope.onChangeData(); 
    } 
} 

link: function preLink(scope, element, attrs) { 
    scope.$watchCollection('arrayData', function (value) { 
      // hide busy indicator 
    }); 
} 
} 
+0

可以請告訴我們onChangeData()是否再次重建arrayData或操作現有的數據。 – Sai

+0

有時它是相同的引用(相同的數組對象),有時它是一個新的對象。 –

+0

從哪裏檢索數組對象?服務器或 - ?你可以找到一種方法來包含指標在某種回調中。 – kubuntu

回答

0

一個就可以實現,這是在你的指令控制器返回像

$scope.onChangeData=function() { 
    var defer=$q.defer(); 
    //process data 
    //resolve defer 
    return defer.promise; 
} 

然後爲onChangeData承諾方式做

$scope.onChangeData().then(function() { 
    //stop animation 
}); 
+0

但是然後我的指示的用戶應該意識到他必須返回一個承諾的事實......這是一個常見的解決方案? –

+0

所以我決定使用類似於你的建議。我在「buttonClicked」中創建了延遲,並將延遲傳遞給控制器​​ - 就像傳遞迴調一樣。 –