在顶级绑定上输入更改事件侦听器

时间:2014-06-18 10:52:11

标签: javascript knockout.js

有没有一种淘汰方式可以做到这一点?

标记:

<div data-bind='topbinding:true'>
  <input type="checkbox" data-bind="checked:checkboxvalue_one"/>
  <input type="checkbox" data-bind="checked:checkboxvalue_two"/>
  <input type="checkbox" data-bind="checked:checkboxvalue_three"/>
</div>

这些复选框可能会也可能不会根据其他api中的内容进行检查。

在&#39; topbinding&#39;的ko绑定中:

ko.bindingHandlers.topbinding = {
    init: function (element) {
        var $checkboxes =  $(element).find('input[type=checkbox]');
        $checkboxes.on('change', function() {
           console.log('changed');
        });
     }
}

问题:如果剩下的api提供的模型值 - (在渲染过程中的某个时间到达)更新复选框值,它将不会触发更改&#39;事件。单击该复选框证明jq监听器设置正常,并且一切都正常。

有什么想法吗?我们试图避免直接在复选框中添加绑定 - 让其他人创建标记变得简单......


编辑:不确定我问过这个问题!再来一次

假设我们在<form>代码上设置了一些javascript来查找<select>并重新将其写入一些时髦的选择&#39;键入<li>并隐藏<select>选择输入,js监听<li>上的事件以设置幕后的选择值。

当一个KO viewmodel值绑定到此后(例如从ajax请求)到达并更新<select>值时,会发生什么 - 表单中绑定的js(使得假选择)如何监听改变 ? -

我已经能够通过将ko.bindingHandler添加到输入来实现这一目的,但是寻找一种可以将其设置为顶级的方法。

1 个答案:

答案 0 :(得分:1)

根据您的最新评论,我相信自定义绑定可能会解决您的淘汰赛问题 你是对的,视图模型是用于逻辑&amp;数据和绑定适用于ui 如果你想让你的开发人员轻松搞定,因为你有一个复杂的绑定,你应该考虑创建一个自定义绑定,而不是使用标准绑定。
我通常将它用于日期选择器和其他外部组件。
代码可能如下所示:

ko.bindingHandlers.foo= {
    init:function(element, valueAccessor, allBindingsAccessor) {
        $(element).on('change', function() {
          console.log('changed');
        });
    }
};

你的加价:

<div data-bind='topbinding:true'>
  <input type="checkbox" data-bind="foo:checkboxvalue_one"/>
  <input type="checkbox" data-bind="foo:checkboxvalue_two"/>
  <input type="checkbox" data-bind="foo:checkboxvalue_three"/>
</div>

这样,无论何时使用新数据更新observable,都会触发自定义bindingHandler的init函数,并且您可以完全自由地使用ui元素。
我不是百分百肯定,但我认为如果你不覆盖更新方法,默认的更新机制仍然有效,如果它不起作用,你需要手动设置和更新值(这使您可以很自由地将ui映射到viewmodel observables)。