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 にリセットしていない可能性はありますか? 初期化時にのみ false に設定されている場合$scope.dataFail、値は変更されず、ウォッチは呼び出されません。$scope.dataFailAngular は変更されたことを認識できないため、既に true になっている場合に true に設定しても、ウォッチは起動しません。

于 2013-02-25T17:16:40.817 に答える