在remove()之后无法调用modal.show()。请创建一个新的模态实例

时间:2016-04-17 10:38:21

标签: angularjs ionic-framework

我正在使用教程中建议的技术在我的控制器中创建modal,只要我不使用该控制器离开视图就可以工作。除此之外,我还创建了一个服务来设置控制器之间的通信。如果我离开视图并返回到它(重新触发控制器),那么模态不再起作用。我得到的控制台错误是:

Cannot call modal.show() after remove(). Please create a new modal instance

到目前为止,这是我的代码:

// services.js

function ModalPopupCommunicationService() {
  var serviceFunction;
  return {
    set: function(funcFromCtrl) {
      serviceFunction = funcFromCtrl;
    },
    call: function() {
      serviceFunction();
    }
  }
}

// controller.js

function PopupController($scope, $ionicPopup, $timeout, $state, ModalPopupCommunicationService) {
  $scope.showPaymentOptionsPopup = function() {
    $ionicPopup.confirm({
      title: 'Payment Options',
      cssClass: 'popup-vertical-buttons',
      buttons: [{
        text: "Add",
        type: 'button-positive',
        onTap: function() {
          ModalPopupCommunicationService.call();
        }
      }, {
        text: "Edit",
        type: 'button-positive',
        onTap: function() {
          $state.go('sidemenu.payment-edit-card', {
            "profile": 1
          });
        }
      }, {
        text: "Close",
        type: 'button-dark',
        onTap: function() {}
      }]
    });
  };
}

function ModalController($scope, $ionicModal, $stateParams, ModalPopupCommunicationService) {
  $ionicModal.fromTemplateUrl('views/payment-add-card.view.html', {
    scope: $scope,
    animation: 'slide-in-up'
  }).then(function(modal) {
    $scope.addCardModal = modal;
  })

  $scope.openAddCardModal = function() {
    $scope.addCardModal.show()
  }

  ModalPopupCommunicationService.set($scope.openAddCardModal);

  $scope.closeAddCardModal = function() {
    $scope.addCardModal.hide();
  };

  $scope.$on('$destroy', function() {
    $scope.addCardModal.remove();
  });
}

2 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为当控制器的范围被销毁时,您正在调用$scope.addCardModal.remove();。评论该行和它应该工作。不建议将模态保留在内存中以避免内存泄漏。您可以通过再次调用$ionicModal.fromTemplateUrl再次返回视图时创建它。

答案 1 :(得分:1)

我认为问题在于您将附加到控制器$ scope的函数的引用传递给服务以与另一个控制器共享它。问题是,如果GC仍然可以被另一个JS对象访问,则无法清除范围。我认为这会导致您重新进入控制器时出现的错误。

我想知道你为什么需要将对该函数的引用传递给另一个控制器。我认为您需要重新考虑代码。