【发布时间】:2017-05-02 04:29:15
【问题描述】:
https://jsfiddle.net/9L8r9etf/2/
我一直在尝试几种不同的方法,但这是我得到的最接近的方法。出于某种原因 this.checked 总是正确的。
javascript:
ko.bindingHandlers.jqmChecked = {
init: function (element, valueAccessor) {
ko.utils.unwrapObservable(valueAccessor()); // This hack for knockout v3
// set the dom element to a checkbox and initialize it (for jquerymobile)
var checkbox = $(element);
// let jquerymobile enhance the element
checkbox.removeAttr('data-role');
// make it so
checkbox.checkboxradio();
//register change event to update the model on changes to the dom
checkbox.on('change', function (e) {
if(this.checked)
valueAccessor()(this.value);
});
},
update: function (element, valueAccessor) {
// update the checked binding, important for correct radio button behaviour.
//ko.bindingHandlers.checked.update(element, valueAccessor);
//ko.utils.unwrapObservable(valueAccessor()); // This hack for knockout v3
// and refresh the element (for jquerymobile)
var checkbox = $(element);
checkbox.checkboxradio('refresh');
checkbox.prop("checked", valueAccessor()()).checkboxradio("refresh");
}
};
var ViewModel = function(repeat) {
var self = this;
self.testa = ko.observable(true);
self.test = ko.observable("dyn");
if(repeat){
self.subView = ko.observable(new ViewModel(false));
}
};
ko.applyBindings(new ViewModel(true));
html:
<fieldset data-role="controlgroup" data-mini="true" data-type="horizontal">
<label><input type="radio" value="inp" name="inpdynout2" checked data-bind="jqmChecked:test"/> inp</label>
<label><input type="radio" value="dyn" name="inpdynout2" data-bind="jqmChecked:test" /> dyn</label>
<label><input type="radio" value="out" name="inpdynout2" data-bind="jqmChecked:test" /> out</label>
</fieldset>
<hr/>
x <span data-bind="text:test"></span><br/>
我知道在淘汰赛 3 中,您需要创建自己的事件侦听器而不是使用 checked.update,但我无法弄清楚如何将它与原始的检查绑定一起使用。
我希望绑定尽可能像淘汰赛 3 香草绑定一样,因为我们已经被自定义绑定不完整的错误所困扰。
【问题讨论】:
标签: jquery-mobile knockout.js knockout-3.0