在询问this question并得到答案后,我有一个模态表单,其内容数据绑定到淘汰模型。这很好,并且使它成为通用和可重用的,只要表单遵循与模板相同的模式,即几个按钮和固定的主体。
我想要的是让身体动态并包含绑定到我的视图模型上的其他值的输入字段。
所以我有这个:
<script id="myModal" type="text/html">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-bind="click:close" aria-hidden="true">×</button>
<h3 data-bind="html:header"></h3>
</div>
<div class="modal-body">
Name:<input type="text" data-bind="value: paramName" /><br/>
Type:<input type="text" data-bind="value: paramType" /><br />
</div>
<div class="modal-footer">
<a href="#" class="btn" data-bind="click:close,html:closeLabel"></a>
<a href="#" class="btn btn-primary" data-bind="click:action,html:primaryLabel"></a>
</div>
</div>
</div>
</script>
扩展表单以包含几个文本输入字段。我是否可以创建此正文内容,以便仍然从我的视图模型填充,但仍然具有数据绑定。所以有一个看起来像这样的vierw模型:
modal = {
header: ko.observable("This is a modal"),
body: ko.observable("Name:<input type='text' data-bind='value: paramName' /><br/>Type:<input type='text' data-bind='value: paramType' /><br />"),
paramName: ko.observable(),
paramType: ko.observable(),
closeLabel: "Cancel",
primaryLabel: "Ok",
show: ko.observable(false), /* Set to true to show initially */
onClose: function () {
self.onModalClose();
},
onAction: function () {
if (self.modal.paramName() && self.modal.paramType()) {
self.nextParameter.name(self.modal.paramName());
self.nextParameter.type(self.modal.paramType());
self.addInputParameter();
self.modal.show(false);
}
}
让模板回归像这样的通用
<script id="myModal" type="text/html">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-bind="click:close" aria-hidden="true">×</button>
<h3 data-bind="html:header"></h3>
</div>
<div class="modal-body" data-bind"html: body">
</div>
<div class="modal-footer">
<a href="#" class="btn" data-bind="click:close,html:closeLabel"></a>
<a href="#" class="btn btn-primary" data-bind="click:action,html:primaryLabel"></a>
</div>
</div>
</div>
</script>
但仍有针对paramName
的第一个输入的敲除绑定更改,并更改为paramType
的第二个输入
答案 0 :(得分:1)
我会使用动态模板处理此问题,如注释5 here中所述。所以它看起来像这样:
modal = {
header: ko.observable("This is a modal"),
//this is now just the name of the template
body: ko.observable('bodyTemplateA'),
// ...
};
然后在你的装订中,做
<div class="modal-body" data-bind="template: { name: body }">
</div>
然后当然分别定义所有需要的模板:
<script id="bodyTemplateA" type="text/html">
Name:<input type="text" data-bind="value: paramName" /><br/>
Type:<input type="text" data-bind="value: paramType" /><br />
</script>
不是你想要的,但我认为这比在你的代码中保持所有各种ko-bound html字符串更容易和可维护。