我在包含ajax调用的angular服务中有一个函数,它执行以下操作:

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

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

Controller 中的$ watch表达式观看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所做的任何更改。有人有什么建议吗?

最佳答案

通过在$ scope.apply中包装对performCall的调用来解决:

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

在performCall方法中设置了dataFail标志。道歉。

10-06 00:16