【问题标题】:Custom Binding wraps value but fails to update自定义绑定包装值但无法更新
【发布时间】: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


【解决方案1】:

假设您使用foreach 绑定将该数组呈现到您的HTML,您实际上可以将您的问题模型作为绑定中的viewModel 属性访问(并且很可能您的根viewModel 为$parent) .你可以阅读更多关于淘汰赛的binding context here

似乎@robert.westerlund 在his JSFiddle 中也提供了一个不错的解决方案。正如小提琴所展示的,值得补充的是,knout 还在 foreach 循环中提供了一个 $index 变量,这可能是一个方便的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 2014-09-13
    • 2021-04-06
    • 2021-06-05
    • 1970-01-01
    相关资源
    最近更新 更多