2

我正在使用 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 的理解而言,我不属于我的联盟。

4

1 回答 1

0

假设您使用foreach绑定将此数组呈现为 HTML,您实际上可以将问题模型作为viewModel绑定中的属性访问(并且很可能您的根 viewModel as $parent)。您可以在此处阅读有关淘汰赛绑定上下文的更多信息。

似乎@robert.westerlund 在他的 JSFiddle中也提供了一个不错的解决方案。正如那个小提琴所说明的那样,值得补充的是,淘汰赛还在$indexforeach 循环中提供了一个变量,这可能是一个方便的帮助。

于 2014-03-07T10:34:10.643 回答