3

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

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

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

我的控制器中的 $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. 有人有什么建议吗?

4

3 回答 3

4

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

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

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

于 2013-02-28T10:44:23.390 回答
2

您的代码有几个问题:

  1. 在 Angular 中,$watch 表达式回调函数只有在表达式改变了值时才会被调用。由于您永远不会重置“dataFail”标志,因此在后续调用中永远不会调用表达式。您应该在 $watch 表达式中将标志变量设置为 false。

  2. 在对话框中,您正在调用 $("#ajaxFailurePopup").remove(); 这会从 DOM 中删除 #ajaxFailurePopup 元素,因此对话框无法再次初始化。你应该使用 $('#ajaxFailurePopup').dialog('destroy');

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

于 2013-02-25T17:20:27.503 回答
0

既然您说手表会在第一个失败的请求时触发,但不会在后续失败的请求中触发,您是否可能不会$scope.dataFail为成功的请求重置为 false?如果$scope.dataFail仅在初始化期间设置为 false,则该值永远不会改变,您的手表也不会被调用。如果它已经为真,则设置$scope.dataFail为真不会触发手表,因为 Angular 无法判断它已更改。

于 2013-02-25T17:16:40.817 回答