2016-02-04 82 views
0

我在應用程序周圍使用範圍來在執行異步請求時顯示微調器。指令不更新我的範圍

也就是說範圍是:$scope.showSpinner = true/false

現在我工作的一個指令和代碼是這樣的:

'use strict'; 

angular.module('orders').directive('resetOrder', ['$rootScope', function ($rootScope) { 
    return { 
    restrict: 'A', 
    link: function (scope, element, attrs) { 
     var order_id = attrs.resetOrder; 
     element.bind('click', function (event) { 
     event.stopPropagation(); 
     alertify.confirm(
      'Warning!', 
      'Are you sure you wish to RESET order id: ' + order_id + '?', 
      function() { 
      scope.showSpinner = true; 
      [ ... ] 
      }, function() { 
      return; 
      } 
     ); 
     }); 
    } 
    }; 
}]); 

scope.showSpinner是不被傳播,我沒有看到積極的微調按下一次重置按鈕。

我試過到目前爲止:

我轉換$scope$rootScope,沒有奏效。 我加了scope.$apply()甚至$rootScope.$apply(),沒有工作。 我把它包裝在$timeout之內,沒用。 我創建了一個範圍:{showSpinner:'='},不起作用。

我不能擺脫這個問題。 我做錯了什麼?

這裏是我添加的指令在HTML:

<button reset-order="{{ order.id }}"> 

感謝您的幫助提前。

+0

它可能是因爲scope.showSpinner如果您的指令是在一個子範圍內。嘗試範圍$ parent.showSpinner = true來確認。如果這能解決它,你就知道原因。 – pixelbits

+0

也不能使用這個解決方案......謝謝。 –

+0

顯然在這一點上猜測。你可以展示一個簡短的蠕蟲來證明這個問題嗎? – pixelbits

回答

0

當您處於alertify.confirm的回調中時,您處於角度上下文之外,因此對範圍屬性的任何更改都不會反映出來。

嘗試:

scope.$apply(function() { 
    scope.showSpinner = true; 
}); 
+0

我已經說過試過這個。謝謝。 –

0

它也許可以致毒becous您的指令有一個致命的缺陷。你只能在給定的範圍內使用它一次。您需要每次創建一個不同的控制器才能重新使用您的指令。這顯然不是一個很好的解決方案。

你想要做的就是將範圍內的範圍與外部範圍分開,然後將外部範圍映射到指令的內部範圍。你可以通過創建我們所說的隔離作用域來做到這一點。爲此,您可以使用指令的範圍選項。

https://docs.angularjs.org/guide/directive

isoleting範圍後添加守望你的指令監控的變化。例如:

scope.$watch('showSpinner', function (newValue, oldValue) { 
    if (newValue == oldValue) { 
     return; 
    } 
    //do something 
});