我正在使用Knockout.js连接动态表单显示。因此,我需要显示和连接数组中的任意数量的“字段”,而不是可爱的命名属性。我觉得我很接近,但是我没有对我的自定义绑定进行最后的修改。
数据
myDynamicFields = [
{
name: "email",
value: "me@gmailllllll.com",
type: "text",
validation: {required: true},
label: "Email Address",
},
{
name: "username",
value: "bobsmith",
type: "text",
validation: {required: true},
label: "Username"
}
];
我正在使用ko.mapping将此数组映射到可观察的可观察数组。因此,不仅整个数组是可观察的,而且诸如“名称”和“值”的每个字段也是可观察的。该数组应该能够包含任意数量的元素,并且键入“name”。
我的自定义绑定
我需要一个自定义绑定(我认为)的原因是,当我的视图中的某些内容发生变化时,我可以连接数组的哪个成员已更改。再一次,它是关键名称,所以我快速查找。检查一下:
ko.bindingHandlers.specialValue = {
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
// This will be called when the binding is first applied to an element
model = _.find(viewModel, function (guy){
return guy.name()==valueAccessor();
});
ko.bindingHandlers.value.init(element, model.value, allBindings, viewModel, bindingContext);
},
update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
model = _.find(viewModel, function (guy){
return guy.name()==valueAccessor();
})
ko.bindingHandlers.value.update(element, model.value, allBindings, viewModel, bindingContext);
}
};
我的模板
(只需遍历我的数组的每个元素)
{{#.}}
<p>{{label}}: <input data-bind='specialValue: "{{name}}", valueUpdate: "afterkeydown"'/></p>
{{/.}}
但是,当我这样做时,没有任何更新。我已经深入研究了Knockout代码,发现_ko_property_writers
上没有一个名为allBindingsObject
的属性,但就此我对Knockout的理解已经超出了我的联盟。< / p>
答案 0 :(得分:0)
假设您使用foreach
绑定将此数组呈现给HTML,您实际上可以将您的问题模型作为绑定中的viewModel
属性访问(并且很可能是您的根视图模型为$parent
)。您可以在淘汰赛binding context here上阅读更多内容。
似乎@ robert.westerlund在his JSFiddle中提供了一个很好的解决方案。正如小提琴所示,值得补充的是,淘汰赛还在foreach循环中提供了一个$index
变量,这可以提供方便的帮助。