Javascript 哪些Knockout.js绑定是;双向;?
js拥有双向绑定,以及Javascript 哪些Knockout.js绑定是;双向;?,javascript,knockout.js,Javascript,Knockout.js,js拥有双向绑定,以及值绑定(应用于文本输入时)如何更新viewmodel 但是,我尝试更新其他绑定(如text),发现视图没有更新viewmodel。请参见此示例: 从knockout的文档中不清楚它们的一些绑定是否是双向的,而另一些则不是。视图在什么条件下可以更新viewmodel?您的问题是,您没有更新可观察值,而是直接修改元素的文本。如果您直接更新输入元素的值,您根本就没有修改可观察值。如果要更新可观察值,可以使用: this.changeName = function() {
值
绑定(应用于文本输入时)如何更新viewmodel
但是,我尝试更新其他绑定(如text
),发现视图没有更新viewmodel。请参见此示例:
从knockout的文档中不清楚它们的一些绑定是否是双向的,而另一些则不是。视图在什么条件下可以更新viewmodel?您的问题是,您没有更新可观察值,而是直接修改元素的文本。如果您直接更新
输入
元素的值,您根本就没有修改可观察值。如果要更新可观察值,可以使用:
this.changeName = function() {
this.name('Bob');
};
.简短回答
双向绑定:通常,所有与用户可以直接更改的内容相关的绑定,无需特殊脚本的帮助,例如表单控件值或状态:value
,hasFocus
,textInput
,checked
,selectedOptions
。或者任何与用户可以更改的内容相关的自定义绑定(典型示例为5个可单击星型,实现为ko自定义绑定)
单向绑定:用户不能直接更改的所有状态,例如可见
。用户不能直接更改可见性:必须通过脚本完成。在这种情况下,脚本不应该更改DOM元素本身的可见性,而应该更改绑定的可观察性。第一种方法不会更新可观察的元素,但后一种方法会更新绑定元素的可见性
长话短说
如果您了解如何实现自定义绑定,您将了解它们是如何工作的:
如果您进一步查看,您将看到init
callback可用于:
对于使用绑定的每个DOM元素,Knockout将调用init函数一次。init有两个主要用途:
1.为DOM元素设置任何初始状态
键位于第二点:如果绑定处理某种事件,它将修改可观察的值,这就是您所考虑的“双向绑定”的“返回”。
因此,任何处理事件以更新可观察工作的绑定都是“双向”绑定。它们是双向的。。。您只是没有像应该的那样更新值。如果要以编程方式进行,可以通过绑定的可观察对象对其进行更改。否则,将值放入输入中。你出去做了一些完全不同的事情……如果你使用jquery,你可以尝试
.trigger('change')
。我在单元测试中使用了它来测试输入元素上的“双向”绑定。@JeffMercado,你是说如果你想更新视图并让它更新值,那么你只能对输入执行该操作吗?对,但根据定义,这不就是单向绑定吗?我必须更新数据中的obseverable值才能更新视图。不是相反吗?@bryanbraun是的,非交互元素不是双向绑定,文本
绑定纯粹是将可观察到的文本拉到页面上。你不能用它做任何事。value
绑定将值从一个可观测值拉到页面上的一个交互元素中,并在元素中的值被修改时更新可观测值。酷,这就是我想要得到的。你知道有没有记录哪些元素是“交互的”吗?只是形式元素?具有contenteditable=“true”
的元素?另外,如果我使用值绑定(而不是文本
,属性
,选中
,等等),我是否只能获得双向绑定?@bryanbraun从Knockout的文档中,值绑定主要针对
,
和
元素。checked
绑定也是一种双向绑定,但遗憾的是,关于checked
绑定的页面上没有提到这一点(而是在value
binding的页面上提到)。至于attr
,我不太清楚为什么需要双向绑定,因为用户通常不会接触到允许他们自己更改这些属性的方法。写得好而且非常有用的答案(+1)。这也可以解释为什么Vue.js提供了更好的双向绑定,现在比Knockout.js更受欢迎。
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.
}
};