【问题标题】:How to Stop the binding when the controls are initializing in the DOM当控件在 DOM 中初始化时如何停止绑定
【发布时间】:2013-05-16 09:22:58
【问题描述】:

我有一个关于淘汰赛绑定到选择列表的问题。问题是,如果我们将点击绑定附加到控件,则只要点击该控件,就会执行该事件。但是为什么在控件加载到 DOM 时会触发此选择更改事件。我最近三周都在使用淘汰赛。这是小提琴。 http://jsfiddle.net/aroor/dUvRx/4/

 <select data-bind='options :list, optionsText: "name", value:selectedItem , event : { change : onSelectChange }'></select>

  var model = function(){
  var self = this;

  self.name = ko.observable();
  self.key = ko.observable();

  self.visible = ko.observable();

  self.selectedItem = ko.observable();

 self.onSelectChange = function(data,event){
    var currentSelection = self.selectedItem();
    if(currentSelection.visible  )
     {
      // display the content according to the selection
     }
  }
 };

 ko.applyBindings(new model());

请帮我解决这个问题。

我不想使用 optionsCaption 来选择默认项。因为该集合来自 ajax 调用。

【问题讨论】:

    标签: select data-binding knockout.js options


    【解决方案1】:

    您的onSelectChange 方法基于选择框的值。因此,当值因数据绑定而发生变化时(例如,当项目首次添加到列表时),触发此事件是正确的。

    与其将更改事件基于选择框,不如将更改事件基于数据绑定属性。

    首先,您可以将列表更改为可观察数组。

    list = ko.observableArray([{ name : "test-01", key : 1, visible: true},
       { name : "test-02", key : 2 , visible: false},
       { name : "test-03", key : 3 , visible: false},
       { name : "test-04", key : 4 , visible: true}
    ]);
    
    selectedItem = ko.observable();
    

    在您的标记中:

    <select data-bind='options :list, optionsText: "name", value:selectedItem'></select>
    

    现在,无论何时您想确定项目是否已更改,都可以使用ko.subscribe 函数。

    selectedItem.subscribe(function(newValue) { /* Do stuff when the value changes here */ });
    

    【讨论】:

    • 谢谢帕特里克,有没有其他方法可以从选择框中获取所选值而不是分配值属性?我可以理解,只要值立即更改,淘汰赛就会绑定控件。与其他输入控件文本、按钮等一样,这些事件将在调用附加的事件处理程序时触发。如果我从选择框中删除值绑定,那么无论何时用户从选择框中选择一个选项,而不是初始阶段,更改事件都会起作用。但问题是如何获取当前选择的值?
    • 您使用值绑定获取或设置当前选项。在我的示例案例中,如果您在任何时候想要获取当前选择的选择,您可以简单地说selectedItem()。这将在option 绑定中返回当前选定的对象。本页介绍了有关使用带有 Knockout 的 &lt;select&gt; 元素的所有内容:knockoutjs.com/documentation/options-binding.html
    • 基本上,一旦你设置了数据绑定,你只需要与 observables 交互。向 select 添加/删除元素将需要从可观察数组(您的 list 变量)中添加/删除元素。获取/设置选择的选择将通过selectedItem observable 完成。也可以使用selectedItem 订阅更改事件。这就是你真正需要的。
    • 好的,我明白了,如果我在事件触发时将事件绑定添加到选择列表(例如:更改),我如何获取当前选定的项目?从 rayn jsfiddle.net/rniemeyer/LBz6d 看到这个小提琴,他使用订阅和事件做到了这一点,从 chnage 事件绑定我们如何获得选定的值?
    • 您不会使用事件 { change } 绑定。为了获取列表选择变化时的事件,你会调用selectedItem.subscribe(function(newValue) { /* Do stuff when the value changes here */ });函数,每次值变化时都会调用该函数,单个参数(本例中为newValue)将包含被选中项的值。
    猜你喜欢
    • 1970-01-01
    • 2012-05-29
    • 2013-05-19
    • 1970-01-01
    • 2019-11-13
    • 2013-09-02
    • 1970-01-01
    • 2021-10-21
    • 1970-01-01
    相关资源
    最近更新 更多