Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Knockout does not recognize manually click

Here is sample http://jsfiddle.net/HhXGH/57/

I am clicking radio button by jquery but knockout.js does not recognize it.Still it shows first clicked value.

<p>Send me spam: <input type="checkbox" data-bind="checked: wantsSpam" /></p>
<div data-bind="visible: wantsSpam">
    Preferred flavor of spam:
    <div><input type="radio" name="flavorGroup" value="cherry" data-bind="checked: spamFlavor" /> Cherry</div>
    <div><input type="radio" name="flavorGroup" value="almond" data-bind="checked: spamFlavor" /> Almond</div>
    <div><input type="radio" name="flavorGroup" value="msg" data-bind="checked: spamFlavor" /> Monosodium Glutamate</div>
</div>


var viewModel = {
        wantsSpam: ko.observable(true),
        spamFlavor: ko.observable('cherry')
    };

ko.applyBindings(viewModel);

$(':radio:last').click();

alert(viewModel.spamFlavor())
like image 303
Freshblood Avatar asked Aug 17 '26 04:08

Freshblood


1 Answers

This because Knockout is subscribing to the click events of checked radio/checkbox elements only. If you checkout the binding handler code for checked. It does this.

var updateHandler = function() {
            var valueToWrite;
            if (element.type == "checkbox") {
                valueToWrite = element.checked;
            } else if ((element.type == "radio") && (element.checked)) {
                valueToWrite = element.value;
            } else {
                return; // "checked" binding only 
                responds to checkboxes and selected radio buttons
            }

So in order to get your code to work do this.

$(':radio:last').prop('checked', true).click();

However if the goal is to check the last value, why not just do

viewModel.spamFlavor("msg");

This would achieve the same result.

Hope this helps.

like image 171
madcapnmckay Avatar answered Aug 19 '26 17:08

madcapnmckay



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!