3

在我的ui-bootstrap模態控制器中,我監視變量。它看起來是這樣的:在模式上定義的調用函數在ui-bootstrap模態關閉中

main.controller('modalCtrl', ['$scope', '$rootScope', '$modalInstance', 
 
    function ($scope, $rootScope, $modalInstance) { 
 

 
     var unregister = $rootScope.$watch(function() { return $rootScope.someVariable; }, 
 
          function (newVal) { 
 
           if (newVal == false) { 
 
            $scope.closeModal(); 
 
           } 
 

 
          }); 
 
     $scope.closeModal = function() { 
 
      unregister(); 
 
      $modalInstance.dismiss('cancel'); 
 
     }; 
 
}]);

當我解僱模式我想註銷$看,當我做到這一點的NG-點擊=「closeModal()」中的HTML它工作正常。但是當我在ESC模式之外點擊模式時,它不起作用。那麼有沒有辦法在解僱時調用我的取消註冊功能。我知道modal.result.then(close(),dismiss());但如果沒有必要,我不想把這個func放到parent $ scope中。

回答

2

只需添加一個更多然後回調到result承諾與unregister

main.controller('modalCtrl', ['$scope', '$rootScope', '$modalInstance', function ($scope, $rootScope, $modalInstance) { 

    var unregister = $rootScope.$watch(function() { 
     return $rootScope.someVariable; 
    }, function (newVal) { 
     if (newVal == false) { 
      $scope.closeModal(); 
     } 
    }); 

    $scope.closeModal = function() { 
     $modalInstance.dismiss('cancel'); 
    }; 

    $modalInstance.result.then(null, unregister); 
}]); 

在這種情況下unregister將兩個closeModal和ESC鍵來調用。順便說一句,您可以一起擺脫$scope.closeModal,並在模板中使用ng-click="$dismiss('cancel')"

+0

非常感謝。我不知道$ modalInstance具有結果保證。我認爲結果承諾只在父範圍的模態變量上。 – user3506697

+0

'$ modalInstance'是'$ modal.open'返回的內容。 – dfsq

0

首先,你真的不應該在$rootScope上存儲任何東西 - 特別是一個用來關閉你的模態的監視變量。你想通過一些觀察變量來關閉你的模態,你試圖解決什麼問題(以及你想要完成的是什麼UX)?這對我來說沒有通過氣味測試,而且在您的預期設計中有些奇怪。其次,關於不想使用已解決的承諾的說法毫無意義。當你打電話給$modal.open(options)時,它會返回一個對象,比如說modalInstance,然後你可以調用你的承諾回調函數。因此,承諾回調與您的modalInstance以及您可能通過options傳遞的任何數據存在於相同的上下文中。

有關如何正確使用$modal服務的示例,請參閱我們的文檔here