Есть ли лучший способ динамически загрузить модель представления и представление для отображения модального режима, чем привязка имени модуля в app.js?
То, что я делаю, кажется мне неприятным, и я хотел бы знать, есть ли лучший способ сделать это: я использую
<compose view-model.bind="modalModel.viewModel"></compose>
в моем app.html. Когда мне нужно отобразить модальный режим, независимо от того, какая модель просмотра активна, будет запущено событие публикации агрегатора событий с модальной моделью, которая содержит три вещи. Модальное название, массив кнопок (строк) и путь модуля к представлению / модели представления. В app.js я подписываюсь на модальное событие, и когда оно проходит, я устанавливаю приложение
this.modalModel = modalModel;
который немедленно связывает и загружает представление и модель представления, затем я отображаю модальный режим (начальный загрузчик). Это работает, но есть несколько проблем, которые говорят мне, что должен быть лучший способ сделать это:
- canDeactivate () и deactivate() никогда не вызываются в загружаемой модельной модели просмотра, когда сбрасывается modalModel app.js.
- Я не думаю, что могу передать какие-либо параметры в метод activ () в модальной viewmodel.
- Это просто кажется вялым.
Может ли быть лучший способ динамически загружать в представление и модель представления, связанные и все такое, таким образом, что он может быть надлежащим образом деактивирован при закрытии модального?
Соответствующий код:
<template>
<require from="./app-head"></require>
<require from="./main-nav"></require>
<!-- actual site content removed for this example -->
<div class="modal" id="main-modal">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-ajax"></div>
<div class="modal-header">
<button type="button" class="close" click.delegate="modalButtonClick('Cancel')">×</button>
<h4 class="modal-title">${modalModel.title}</h4>
</div>
<div class="modal-body">
<!-- EMPHASIS HERE: -->
<compose view-model.bind="modalModel.viewModel"></compose>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-sm btn-default" repeat.for="button of modalModel.buttons"
click.delegate="modalButtonClick(button)">
${button}
</button>
</div>
</div>
</div>
</div>
</template>
export class App {
//...
attached() {
//...
this.listen('show-modal', this.displayModal.bind(this));
this.listen('hide-modal', this.closeModal.bind(this));
this.listen('show-modal-loader', this.showModalLoader.bind(this));
this.listen('hide-modal-loader', this.hideModalLoader.bind(this));
}
displayModal(modalModel) {
this.modalModel = modalModel;
$('#main-modal').modal();
}
closeModal() {
$('#main-modal').modal('hide');
this.modalModel = null;
}
showModalLoader() {
document.querySelector('#main-modal .modal-ajax').style.display = 'block';
}
hideModalLoader() {
document.querySelector('#main-modal .modal-ajax').style.display = 'none';
}
listen(event, fn) {
this.eventAggregatorSubscriptions.push(this.ea.subscribe(event, fn));
}
}
1 ответ
Используйте плагин aurelia-dialog.
Установить: jspm install aurelia-dialog
Для активации: в main.js
configure()
, вызов aurelia.use.plugin('aurelia-dialog');
Использование: https://github.com/aurelia/dialog