我可以使knockout从其他绑定中的值生成绑定吗?

时间:2014-03-17 18:52:06

标签: javascript data-binding knockout.js

在询问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">&times;</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">&times;</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的第二个输入

1 个答案:

答案 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字符串更容易和可维护。