0

$uibModal を使用して、親ウィンドウの解決内から別のモーダル ウィンドウを開くという問題に遭遇しました。その解決引数で。

動作する例と動作しない例の唯一の違いは、 setTimeout を使用して内部ポップアップが開くのを遅らせることです。

失敗例 - setTimeout の使用

$scope.doesntWork = function(){
    $uibModal.open({
      templateUrl : 'popup.html',
      resolve : {

        test : function(){
          var q = $q.defer();

          //This inner poppup wont show until the outer one is also
          //allowed to show (Resolve is resolved)
          setTimeout(function(){
            $uibModal.open({
              templateUrl : 'popup_inner.html' 
            });
          },1);

          setTimeout(function(){
            q.resolve(5);

          },2000);
          return q.promise;
        }
      }

    });  
  };

作業例 - setTimeout なし

  $scope.works = function(){
    $uibModal.open({
      templateUrl : 'popup.html',
      resolve : {

        test : function(){
          var q = $q.defer();
           $uibModal.open({
              templateUrl : 'popup_inner.html' 
            });

          setTimeout(function(){
            q.resolve(5);

          },2000);
          return q.promise;
        }
      }

    });  
  };

内側のポップアップを開くために開かれている外側のポップアップに依存しないため、なぜこれが起こっているのかわかりません。

plunkr を参照してください:こちら

アップデート

興味深いことに、モーダルをオフに設定してから、解決引数を使用して別のモーダルを開こうとした場合でも、最初のモーダルとは関係ありませんが、2 番目のモーダルで解決が完了するまで表示されません。私が知っている現実世界のシナリオではありませんが、その理由を理解したいと思っています。

$scope.doesntWork = function(){

    $timeout(function(){
        $uibModal.open({
          templateUrl : 'popup_inner.html' 
        });
    },1);

    //unrelated to the above modal yet blocks it from showing until  
    //resolved finished

    $uibModal.open({
      templateUrl : 'popup.html',
      resolve : {

        test : function(){
          var q = $q.defer();
          setTimeout(function(){
            q.resolve(5);

          },2000);
          return q.promise;
        }
      }

    });  
  };
4

1 に答える 1

0

解決策は、タイムアウト内に $scope.$apply を呼び出すことだと思います。

例えば

setTimeout(function(){
        $scope.$apply(function() {
          $uibModal.open({
          templateUrl : 'popup_inner.html' 
        });
     })
 },1);

プランクでテストされ、正常に動作します。

于 2016-05-26T12:16:00.470 に答える