Bind knockout.js to a boolean JQuery Mobile flip switch toggle

我的未来我决定 提交于 2019-12-23 02:17:33

问题


i have a boolean value bound to a JQM flip switch toggle, but i'm not able to see it reacting to changes to the underlying observable.

This is my true/false observable:

ko.booleanObservable = function (initialValue) {
    var _actual = ko.observable(initialValue);
    var result = ko.computed({
        read: function () {
            var readValue = _actual().toString();
            return readValue;
        },
        write: function (newValue) {
            var parsedValue = (newValue === "true");
            _actual(parsedValue);
        }
    });
    return result;
};

Which is the best way to combine JQM flip switch toggle and Knockout?

jsFiddle here: http://jsfiddle.net/nmq7z/

Thanks in advance to all

UPDATED: with a better test case: http://jsfiddle.net/FU7Nq/


回答1:


I got it,

Thanks to kadumel which point out that my first piece of code was really bad. Then, i switched from a computed observable to a custom binding, which seems to me a good solution:

ko.bindingHandlers.jqmFlip = {
    init: function (element, valueAccessor) {
        var result = ko.bindingHandlers.value.init.apply(this, arguments);
        try {
            $(element).slider("refresh");
        } catch (x) {}
        return result;
    },
    update: function (element, valueAccessor) {
        ko.bindingHandlers.value.update.apply(this, arguments);
        var value = valueAccessor();
        var valueUnwrapped = ko.utils.unwrapObservable(value);
        try {
            $(element).slider("refresh");
        } catch (x) {}
    }
};



<select name="select-ismale" id="select-ismale" data-bind="jqmFlip: isMale.formattedValue" data-role="slider">
    <option value="false">No</option>
    <option value="true">Yes</option>
</select>

Here is the working Fiddle: http://jsfiddle.net/FU7Nq/1/

Hope this can help some other People to deal with the JQM Flip Switch Toggle.

The binding with a "true" boolean observable is realized through an extender: this is the meaning of isMale.formattedValue.

This very clean and powerful solution is described in Tim's blog (thank You, Tim!).




回答2:


Two things of note -

When you are making the checked value dependent on something I believe you need to use value: binding instead of checked: binding.

Second - You are setting it equal to a string of 'true' instead of boolean true, but your binding is to a boolean of true.

Try those adjustments in your binding and let me know if that doesn't fix it.




回答3:


ko.bindingHandlers.jqmBindFlipSwitch = {
    init: function (element, valueAccessor) {
        $(element).change(function () {
            var value = valueAccessor();
            value($(element).is(":checked"));
        }).blur(function () {
            var value = valueAccessor();
            value($(element).is(":checked"));
        });
    },
    update: function (element, valueAccessor) {
        var value = valueAccessor();
        var valueUnwrapped = ko.utils.unwrapObservable(value);
        $(element).prop('checked', valueUnwrapped)
            .flipswitch().flipswitch('refresh'); 
    }
};

<input data-bind="jqmBindFlipSwitch: siteVisitRequired" type="checkbox" data-on-text="Yes" data-off-text="No" />

This seems to work fairly cleanly



来源:https://stackoverflow.com/questions/17513767/bind-knockout-js-to-a-boolean-jquery-mobile-flip-switch-toggle

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!