自定义绑定包装值但无法更新

时间:2014-02-25 18:03:36

标签: javascript knockout.js custom-binding

我正在使用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>

1 个答案:

答案 0 :(得分:0)

假设您使用foreach绑定将此数组呈现给HTML,您实际上可以将您的问题模型作为绑定中的viewModel属性访问(并且很可能是您的根视图模型为$parent)。您可以在淘汰赛binding context here上阅读更多内容。

似乎@ robert.westerlund在his JSFiddle中提供了一个很好的解决方案。正如小提琴所示,值得补充的是,淘汰赛还在foreach循环中提供了一个$index变量,这可以提供方便的帮助。