Knockout.js 将属性绑定到html模板以减少html代码

Knockout.js 将属性绑定到html模板以减少html代码,knockout.js,Knockout.js,我有一个可以观察到的敲除,有一大堆属性。我现在有很多重复的html,除了属性名之外基本上是一样的。有没有什么方法可以将for/in的等效项与敲除模板一起使用 我有许多字段(大约20个)希望以引导形式显示,因此每个字段都将使用以下html: <div class="form-group"> <label data-bind="text: $parent.locale.fields.XYZ" for="XYZ" class="col-sm-3 control-label n

我有一个可以观察到的敲除,有一大堆属性。我现在有很多重复的html,除了属性名之外基本上是一样的。有没有什么方法可以将for/in的等效项与敲除模板一起使用

我有许多字段(大约20个)希望以引导形式显示,因此每个字段都将使用以下html:

<div class="form-group">
    <label data-bind="text: $parent.locale.fields.XYZ" for="XYZ" class="col-sm-3 control-label no-padding-right"></label>
    <div class="col-sm-9">
        <input data-bind="value: XYZ" type="text" name="XYZ" class="col-xs-10 col-sm-5" />
    </div>
</div>

其中XYZ是字段的名称。是否有任何方法可以循环遍历每个属性,从而不必为每个字段重复html代码

下面是一个小提琴的例子:。请注意,我的字段实际上不是field1、field2等,因此我不能使用数字循环。

您可以使用(仅IE9+)获取给定对象的属性名称

然后您可以在
foreach
中使用它,在这里您可以使用
$data
访问属性名称,并使用数组索引器语法访问您的可观察对象:

<form data-bind="foreach: Object.keys(data())" role="form">    
    <div class="form-group">
        <label data-bind="text: $parent.locale.fields[$data], 
                          attr: { for: [$data] }" 
             class="col-sm-3 control-label no-padding-right"></label>
        <div class="col-sm-9">
            <input data-bind="value: $parent.data()[$data], 
                          attr: { name: [$data] }" 
                 type="text" class="col-xs-10 col-sm-5" />
        </div>
    </div>    
</form>

演示


在生产环境中,您可能不希望直接在绑定中使用
Object.keys
,但您可以在viewmodel中生成属性名称数组(您也可以排除某些属性等)。

您正在寻找类似的内容吗?好极了,差不多就是这样。编辑小提琴以执行for=和name=属性()。你能添加这个作为答案吗?谢谢-关于使用属性名数组的好主意。这意味着我可以将表单仅限于某些字段(例如,不包括标题)。更新小提琴: