jquery mobile和knockout复选框没有用viewmodel更新

时间:2013-09-30 02:58:17

标签: jquery-mobile knockout.js

我有两个jQuery Mobile复选框绑定到同一个knockout viewmodel成员。 我希望点击一个复选框来更新视图模型,然后更新另一个复选框以进行检查。参见示例here

HTML

<span data-bind="text: chk"></span>
<input id="checkbox1" name="" data-bind="checked: chk" type="checkbox">
<label for="checkbox1">A</label>
<input id="checkbox2" name="" data-bind="checked: chk" type="checkbox">
<label for="checkbox2">B</label>

Javascript

function ViewModel(){
var self = this;

self.chk = ko.observable(false);
}

ko.applyBindings(new ViewModel());

我可以看到模型正在更新,文本字段显示其值。 但是复选框不是

2 个答案:

答案 0 :(得分:5)

问题是当底层复选框控件改变其状态时,jQuery Mobile必须刷新其复选框的自定义绘图,但是当您通过Knockout以编程方式更改它时它无法检测到它。它只检测onclick事件。这必须通过自定义的敲除绑定来完成。

我创建了一个简单的自定义绑定,适用于所有版本的KO(包括最新的v3 ):

ko.bindingHandlers.jqmChecked = {
    init: ko.bindingHandlers.checked.init,
    update: function (element, valueAccessor) {
        //KO v3 and previous versions of KO handle this differently
        //KO v3 does not use 'update' for 'checked' binding
        if (ko.bindingHandlers.checked.update) 
            ko.bindingHandlers.checked.update.apply(this, arguments); //for KO < v3, delegate the call
        else 
            ko.utils.unwrapObservable(valueAccessor()); //for KO v3, force a subscription to get further updates

        if ($(element).data("mobile-checkboxradio")) //calling 'refresh' only if already enhanced by JQM
            $(element).checkboxradio('refresh');
    }
};

应该像这样使用:

<input type="checkbox" data-bind="jqmChecked: someValue" id="checkbox1"/>

请在此处查看完整的工作示例:

<强> http://jsfiddle.net/srgstm/ub6sq/

答案 1 :(得分:2)

你的问题与Jquery手机没有淘汰相关联。 我发现帮助你的唯一解决方案是在你的模型上使用一个suscription来处理它。

function myViewModel(){
    var self = this;
    self.chk2      = ko.observable(false);
    self.chk       = ko.observable(false);
    self.chk.subscribe(function(newValue) {
        console.log (newValue);
        //Handle jQuery Mobile
        $("input[data-bind='checked: chk']").each(function(){
            if ($(this).is(':checked') != newValue)  {
                $(this).prop('checked', newValue).checkboxradio("refresh");
            }
        });
    });
}



ko.applyBindings(new myViewModel());

这里是jsFiddle:http://jsfiddle.net/9QSaY/