【问题标题】:Which Knockout.js bindings are "Two-way"?哪些 Knockout.js 绑定是“双向”的?
【发布时间】:2015-07-15 08:04:54
【问题描述】:

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

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

从淘汰赛的文档中不清楚它们的某些绑定是否是双向的,而另一些则不是。视图在什么情况下可以更新视图模型?

【问题讨论】:

  • 它们是双向的……您只是没有按应有的方式更新值。如果你打算以编程方式进行,你可以通过绑定的 observable 来改变它。否则,您将值放入输入中。你出去做了一些完全不同的事情......
  • 如果你使用 jquery,你可以试试.trigger('change')。我在单元测试中使用它来测试输入元素上的“双向”绑定。
  • @JeffMercado,您是说如果您想更新视图并让它更新值,那么您只能对输入执行此操作?

标签: javascript knockout.js


【解决方案1】:

简答

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

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

长答案

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

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 回调可以用于什么:

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

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

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

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

因此,任何处理事件以更新 observable 的绑定都是“双向”绑定。

【讨论】:

  • 写得很好且很有帮助的答案 (+1)。这也可以解释为什么提供更好的双向绑定的 Vue.js 现在比 Knockout.js 更受欢迎。
【解决方案2】:

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

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

JSFiddle demo.

【讨论】:

  • 是的,但是根据定义,这不是使它成为一种单向绑定吗?我必须更新数据中的可观察值才能更新视图。不是反过来吗?
  • @bryanbraun 是的,非交互式元素不是双向绑定 - text 绑定纯粹将文本从可观察对象拉到页面上。你不能用它做任何事情。 value 绑定将值从 observable 拉到页面上的交互式元素中,并在元素中的值被修改时更新 observable。
  • 酷,这就是我想要达到的目的。你知道它是否记录了哪些元素是“交互式的”?只是表单元素?带有contenteditable="true" 的元素?另外,如果我使用值绑定(不是textattrchecked 等),我是否只能获得双向绑定?
  • @bryanbraun 在 Knockout 的文档中,value 绑定主要针对 <input><select><textarea> 元素。 checked 绑定也是双向绑定,但不幸的是,关于 checked 绑定的页面上没有提到这一点(而是在 value 绑定页面上提到)。至于attr,我不确定为什么这些需要双向绑定,因为用户通常不会接触到允许他们自己更改这些的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
  • 2012-11-10
  • 2020-06-03
  • 1970-01-01
  • 2015-04-26
相关资源
最近更新 更多