Knockout.js拥有双向绑定,活生生的例子如何使用value绑定(当应用于文本输入时)更新视图模型。
但是,我尝试更新其他绑定(如text),发现视图没有更新视图模型。参见本例:http://jsfiddle.net/w7t89tuu/
从“淘汰赛”的文档来看,目前还不清楚它们的一些绑定是双向的,而另一些则不是。在什么情况下视图可以更新视图模型?
发布于 2015-05-05 23:16:15
简短回答
双向绑定:通常,所有绑定都与用户可以直接更改的内容相关,而无需特殊脚本的帮助,如表单控件值或状态:value、hasFocus、textInput、checked、selectedOptions。或与用户可以更改的内容相关的任何自定义绑定(作为ko自定义绑定实现的5颗可点击星星的典型示例)。
单向绑定:用户不能直接更改的所有状态,例如visible。用户不能直接更改可见性:必须通过脚本完成。在这种情况下,脚本不应该更改DOM元素本身的可见性,而应该更改可观察到的绑定。第一个将不会更新可观察到的内容,但后者将更新绑定元素的可见性。
长答案
如果您查看如何实现自定义绑定,您将了解它们是如何工作的:创建自定义绑定
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.
}
};如果您再看一看,您将看到init回调可以用于什么:
对于使用绑定的每个DOM元素,敲除将调用一次init函数。init有两种主要用途: 1.为DOM元素设置任何初始状态
关键在于第二点:如果绑定处理某种事件,它将修改可观察的值,这就是您所认为的“双向绑定”的“回溯”。
因此,任何处理事件的绑定都会将可观察到的工作更新为“双向”绑定。
发布于 2015-05-05 14:25:25
您的问题是,您没有更新可观察到的值,而是直接修改元素的文本。如果直接更新同样的事情也发生了元素的值,则根本没有修改可观察的值。如果要更新可观测值,可以使用:
this.changeName = function() {
this.name('Bob');
};JSFiddle演示。
https://stackoverflow.com/questions/30055507
复制相似问题