Я использую железный маршрутизатор для передачи данных в bootstrap модальный шаблон. Модал содержит форму html, включающую множество текстовых вводов. Модал повторно используется для 3 различных функций. Я использую переменную Session, чтобы отслеживать, какой модальный тип используется. Тип 0 = пустая форма, тип 1 = частичное редактирование, тип 2 = полное редактирование. Сама форма визуально остается одинаковой для всех типов. Изменяется только то, какие поля ввода содержат значение.
Для редактирования типа 1 только 2 поля будут содержать значения. Для редактирования типа 2 все поля будут содержать значения. И тип 0 будет пустыми полями.
// routes.js
Router.route('/mypage', function () {
var mtype = Session.get("mtype");
this.layout('myLayout');
this.render('my_popup', {to:'my_popup', data: function() {
switch (mtype) {
case 1:
return {box1:'box 1 text', box2:'box 2 text', box3:''};
case 2:
return {box1:'box 1 text', box2:'box 2 text', box3:'box 3 value'};
default:
return {box1:'', box2:'', box3:''};
}
}});
});
// main.html
<template name="myLayout">
{{> yield "my_popup"}}
</template>
<template name="my_popup">
<div class="modal fade" id="my_popup">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<div class="modal-title label label-primary">Title</div>
</div>
<div class="modal-body">
<form class="js-form-submit" id="my_form" name="my_form">
<div class="form-group">
<input class="form-control" type="text" name="box1" maxlength="64" placeholder="something" value="{{box1}}"/>
</div>
<div class="form-group">
<input class="form-control" type="text" name="box2" maxlength="64" placeholder="something" value="{{box2}}"/>
</div>
<div class="form-group">
<input class="form-control" type="text" name="box3" maxlength="64" placeholder="something" value="{{box3}}"/>
</div>
</form>
</div>
<div class="modal-footer">
<button class="js-form-ok btn btn-success btn-sm">submit</button>
<button class="btn btn-warning btn-sm" data-dismiss="modal">cancel</button>
</div>
</div>
</div>
</div>
</template>
Сначала я попытался передать объект модальному шаблону, который содержал только те свойства, которые будут отображаться. Это не переписывало существующие входные значения, поэтому мне приходилось использовать один и тот же объект для каждого модального типа и использовать пустые строки для неиспользуемых свойств. Я попытался вызвать метод reset () в форме, прежде чем показывать модальное. В этом случае это привело к тому, что весь шаблон прекратил повторную визуализацию.
Перед тем, как показывать модальное значение, я установил переменную сеанса в тип модального типа, который будет отображаться. Session.set('mtype', 1);
Это заставляет железный маршрутизатор отправлять правильные данные в шаблон, неиспользуемые свойства очищаются, и шаблон успешно перерисовывается.
К сожалению, если я введу один из html входов, шаблон не будет сбросьте его значение при повторном рендеринге. Похоже, это связано с той же проблемой, с которой я столкнулся при использовании метода reset (). Если входные данные содержат пользовательский текст (значение набрано), то модальное окно не отображает новые данные, отправленные в шаблон при изменении переменной Session. Сохраняет введенный пользователем текст.
Какой лучший способ повторно использовать модальную форму bootstrap в метеоре? Должен ли я использовать помощник вместо железного маршрутизатора, чтобы получить объект данных? Что-то вроде ...
{{#with getData}}
Почему вводимый пользователем текст сохраняется?
Я также пытался использовать атрибут defaultValue вместо значения. Та же проблема возникает с обоими атрибутами.
Чтобы проверить ошибку:
- откройте веб-консоль
Session.set('mtype',1);
$('#my_popup').modal('show');
- введите что-нибудь в 3-е текстовое поле
- щелкните модал, чтобы скрыть его
Session.set('mtype',0);
$('#my_popup').modal('show');
Вы увидите, что введенное вами значение по-прежнему видно, несмотря на то, что в каждое поле были отправлены пустые строки.
Другой способ:
Session.set('mtype',2);
$('#my_form')[0].reset();
Session.set('mtype',1);
$('#my_popup').modal('show');
Вы увидите, что ни один из блоков не содержит значений, несмотря на отправку новых строк текста в каждую клеточку.