哪个Knockout.js绑定是“双向”?

时间:2015-05-05 14:15:36

标签: javascript knockout.js

Knockout.js拥有双向绑定,live examples show btnsuit1 = new JButton(); 绑定(当应用于文本输入时)如何更新视图模型。

但是,我尝试更新其他绑定(如value)并发现视图不更新viewmodel。请参阅此示例:http://jsfiddle.net/w7t89tuu/

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

2 个答案:

答案 0 :(得分:5)

简短回答

双向绑定:通常所有绑定都与用户可以直接更改的内容相关,而无需特殊脚本的帮助,例如表单控件值或状态:valuehasFocus,{ {1}},textInputchecked。或任何与用户可以更改的内容相关的自定义绑定(5个可点击星形的典型示例,实现为ko自定义绑定)。

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

答案很长

如果您了解如何实施自定义绑定,您将了解它们的工作原理:Creating custom bindings

visible

如果你进一步观察,你会看到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. } }; 回调可用于:

  

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

     

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

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

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

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

答案 1 :(得分:3)

您的问题是您没有更新可观察值,而是直接修改元素的文本。如果您直接更新input元素的值,则same thing happens - 您根本不会修改可观察值。如果要更新可观察值,可以使用:

this.changeName = function() {
    this.name('Bob');
};

JSFiddle demo