我正在使用教程中建议的技术在我的控制器中创建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();
});
}
答案 0 :(得分:2)
这种情况正在发生,因为当控制器的范围被销毁时,您正在调用$scope.addCardModal.remove();
。评论该行和它应该工作。不建议将模态保留在内存中以避免内存泄漏。您可以通过再次调用$ionicModal.fromTemplateUrl
再次返回视图时创建它。
答案 1 :(得分:1)
我认为问题在于您将附加到控制器$ scope的函数的引用传递给服务以与另一个控制器共享它。问题是,如果GC仍然可以被另一个JS对象访问,则无法清除范围。我认为这会导致您重新进入控制器时出现的错误。
我想知道你为什么需要将对该函数的引用传递给另一个控制器。我认为您需要重新考虑代码。