我正在使用 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 将此数组映射到可观察的可观察数组。所以不仅整个数组是可观察的,“名称”和“值”等每个字段也是可观察的。这个数组应该能够有任意数量的元素,并以“名称”为键。
我的自定义绑定
我需要自定义绑定(我认为)的原因是,当我的视图发生变化时,我可以连接数组的哪个成员发生了变化。再次,它以名称为键,因此我进行了快速查找。核实:
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 的理解而言,我不属于我的联盟。