哪个Knockout.js绑定是"双向"?

bry*_*aun 4 javascript knockout.js

Knockout.js拥有双向绑定,而活生生的实例展示了如何value结合(当用于文本输入)更新视图模型.

但是,我尝试更新其他绑定(例如text)并发现视图不更新viewmodel.看这个例子:http://jsfiddle.net/w7t89tuu/

从淘汰赛的文件中不清楚他们的一些绑定是双向的而其他绑定是不是.在什么条件下视图可以更新viewmodel?

Jot*_*aBe 5

简短的回答

双向绑定:一般所有相关的东西绑定,用户可以直接更改,无需特殊脚本的帮助,就像形式的控制值或状态:value,hasFocus,textInput,checked,selectedOptions.或任何与用户可以更改的内容相关的自定义绑定(作为ko自定义绑定实现的5个可点击星的典型示例).

单向绑定:例如,用户无法直接更改的所有状态visible.用户无法直接更改可见性:必须通过脚本完成.在这种情况下,脚本不应更改DOM元素本身的可见性,但应更改绑定的observable.第一个不会更新observable,但后者会更新bound元素的可见性.

答案很长

如果您了解如何实现自定义绑定,您将了解它们的工作原理:创建自定义绑定:

ko.bindingHandlers.yourBindingName = {
  init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
    // This will be called when the binding is first applied to an element
    // Set up any initial state, event handlers, etc. here
  },
  update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
    // This will be called once when the binding is first applied to an element,
    // and again whenever any observables/computeds that are accessed change
    // Update the DOM element based on the supplied values here.
  }
};
Run Code Online (Sandbox Code Playgroud)

如果你进一步观察,你会看到init可以使用什么回调:

Knockout将为您使用绑定的每个DOM元素调用一次init函数.init有两个主要用途:

1.设置DOM元素的任何初始状态

  1. 要注册任何事件处理程序,以便,例如,当用户单击或修改DOM元素时,您可以更改关联的observable的状态

关键是在第二点:如果绑定处理某种事件,它将修改可观察值,这是你认为"双向绑定"的"回路".

因此,任何处理事件以将可观察工作更新为"双向"绑定的绑定.