2013-02-25 35 views
3

我有一個角度的服務包含Ajax調用做一個函數如下:

function performCall($scope){ 
    $scope.dataFail = false; 

    var promise = doAjaxCall(); 
    promise.then(function(data){ 
     if(data.rootElement){ 
     //process... 
     }else{ 
     $scope.dataFail=true; 
     } 
    } 
} 

而且在我的控制器看dataFail一個$監視表達式,並用顯示一個對話框當對話框被確認時調用performCall選項:

$scope.$watch('dataFail', function(dataFail){ 
    if(dataFail){ 
     //open dialog 
     $("#ajaxFailurePopup").dialog({ 
      zIndex: 3003, 
      title: "Note:", 
      modal:true, // Disable controls on parent page 
      buttons: { 
       Ok: { 
        text: 'Retry >', 
        "class" : 'ppButton floatRight', 
        click: 
         function() { 
              service.performCall($scope); 
         $("#ajaxFailurePopup").remove(); 
         } 
        } 
       } 
      }); 
     }; 
    }); 

當ajax調用第一次失敗時,這在初始化時正常工作。但是,在此之後dataFail沒有更改由$watch註冊。有人有任何建議嗎?

+0

您在事件中有額外空間。 ''dataFail''<===好,猜到了。 – 2013-02-25 16:31:31

+0

不幸的是在這種情況下不相關,因爲這個問題在原始代碼中不存在。這僅僅是代碼的概要。在例子中修改。 – noiselesslark 2013-02-25 16:34:07

回答

4

解決通過包裝調用scope.apply performCall在$:

$scope.apply(
    service.performCall($scope); 
) 

的dataFail標誌是在performCall方法的設置。道歉。

0

由於您認爲手錶在第一次失敗的請求中觸發,但在隨後的失敗請求上觸發,您是否有可能因爲成功的請求而將$scope.dataFail重置爲false?如果$scope.dataFail只在初始化期間設置爲false,則該值永不改變,手錶不會被調用。如果已經爲true,則將$scope.dataFail設置爲true將不會觸發該手錶,因爲Angular無法辨別其已更改。

2

有幾個與你的代碼的問題:

  1. 在折角,$監視表達式調用回調函數,只有當表達式改變了值。既然你永遠不會重置你的'dataFail'標誌,表達式在後續調用中永遠不會被調用。您應該在$ watch表達式中將您的標誌變量設置爲false。

  2. 在對話框中調用$(「#ajaxFailurePopup」)。remove();從DOM中刪除#ajaxFailurePopup元素,因此對話框無法再次初始化。你應該使用$('#ajaxFailurePopup')。dialog('destroy');

工作plnkr:http://embed.plnkr.co/wcooiJ