我正在构建一个提供服务来打开和关闭它的模式。该模态有一个小控制器,用于控制关闭按钮,以及$compile
进入模态内容的模板。
该模板是一个组件,当然,该组件有一个控制器。
隐藏模式后如何销毁该组件?从技术上讲,当 ng-if 负责从 DOM 中删除我的模式时,它仍然会加载该组件。
这是代码:
modal.controller.js
class ModalController {
constructor($scope, modalService, $compile, $timeout) {
this.$scope = $scope;
this.modalService = modalService;
this.$compile = $compile;
this.$timeout = $timeout;
}
$onInit() {
this.$scope.$watch(this.modalService.getConfig(), (newVal) => {
this.config = newVal.isDisplayed
? angular.extend(this.config, newVal)
: {};
// I wait for ng-if to put the modal into the DOM then I
// compile the component.
this.$timeout(() => {
if (this.config.template) {
const component = this.$compile(this.config.template)(this.$scope);
angular.element('#modal-content').html(component);
this.config.isRendered = true;
}
}, 0);
}, true);
}
close() {
this.modalService.close();
}
}
ModalController.$inject = [
'$scope',
'modalService',
'$compile',
'$timeout',
];
export default ModalController;
modal.service.js
class ModalService {
constructor($timeout) {
this.config = {};
this.$timeout = $timeout;
}
open(newConfig) {
this.config = newConfig;
this.config.isDisplayed = true;
}
close() {
this.config.template = null;
this.config.isRendered = false;
// the reason there is timeout here is to run my CSS animation
// before ng-if removes the modal from the DOM.
this.$timeout(() => {
this.config.isDisplayed = false;
this.config = {};
}, 310);
}
getConfig() {
return () => this.config;
}
}
ModalService.$inject = [
'$timeout',
];
export default ModalService;
我称之为模态的 BarController:
class BarController {
constructor(modalService) {
this.modalService = modalService;
}
openModal() {
this.modalService.open({
title: 'Add a document',
template: '<foo-component></foo-component>',
});
}
}
BarController.$inject = [
'modalService',
];
export default BarController;