Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/462.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 哪些Knockout.js绑定是;双向;?_Javascript_Knockout.js - Fatal编程技术网

Javascript 哪些Knockout.js绑定是;双向;?

Javascript 哪些Knockout.js绑定是;双向;?,javascript,knockout.js,Javascript,Knockout.js,js拥有双向绑定,以及值绑定(应用于文本输入时)如何更新viewmodel 但是,我尝试更新其他绑定(如text),发现视图没有更新viewmodel。请参见此示例: 从knockout的文档中不清楚它们的一些绑定是否是双向的,而另一些则不是。视图在什么条件下可以更新viewmodel?您的问题是,您没有更新可观察值,而是直接修改元素的文本。如果您直接更新输入元素的值,您根本就没有修改可观察值。如果要更新可观察值,可以使用: this.changeName = function() {

js拥有双向绑定,以及
绑定(应用于文本输入时)如何更新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元素设置任何初始状态

  • 注册任何事件处理程序,例如,当用户单击或修改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.
      }
    };