【发布时间】:2014-03-28 03:54:12
【问题描述】:
我正在使用 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 代码,发现 allBindingsObject 上不存在名为 _ko_property_writers 的属性,但就目前对 Knockout 的理解而言,我并不在意。
【问题讨论】:
-
嗯,怎么绑定值呢?
-
@EricHerlitz 我对你的问题感到困惑。我正在制作一个包含现有绑定 (ko.bindingHandlers.value) 的自定义绑定,假设它足以更新更改时的值
-
我对您要更新的内容感到困惑。由此看来,您在元素中输入名称然后找到匹配项,然后您尝试将同一元素更新为模型的 value 属性。这似乎非常奇怪。如果是这种情况,那么您可能需要 element.value = ko.utils.unwrapObservable(valueAccessor()) 之类的东西。否则我很茫然。
-
我不确定为什么您需要一个自定义 bindingHandler 来处理这种情况。我写了a small jsfiddle sample using your myDynamicFields,它展示了一种绑定这些的方法。如果这不是您想要做的,也许您可以进一步详细说明您的问题,也许还可以创建一个 jsfiddle 来显示您的问题(您拥有什么以及您想要什么作为输出)。
-
@robert.westerlund 没有意识到 ko 会自动跟踪哪个是哪个。感谢您的帮助!
标签: javascript knockout.js custom-binding