3

这是示例http://jsfiddle.net/HhXGH/57/

我正在单击 jquery 的单选按钮,但 knockout.js 无法识别它。它仍然显示第一次单击的值。

<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())
4

3 回答 3

4

这是因为 Knockout 仅订阅选中的单选/复选框元素的点击事件。如果您签出绑定处理程序代码以进行检查。它这样做。

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
            }

因此,为了让您的代码正常工作,请执行此操作。

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

但是,如果目标是检查最后一个值,为什么不直接做

viewModel.spamFlavor("msg");

这将达到相同的结果。

希望这可以帮助。

于 2012-05-26T20:34:50.407 回答
1

除了$(':radio:last').attr('checked', true);触发点击之外,它还对我有用:

http://jsfiddle.net/jearles/HhXGH/61/

于 2012-05-26T20:21:46.390 回答
0

我有两个不同的 jsFiddles,因为我不确定你到底想要什么。

手动单击最后一个单选按钮时,第一个 jsFiddle将通过警报响应。

第二 jsFiddle是您发布的/57/ jsFiddle 没有警报。

使用带有函数的alert 或 console.log实际上会调用该函数。也就是说,在您手动将 设置为最后一个单选按钮后,它会无意中重置回,因为这是默认值。.click()cherry

重新编辑:第二jsFiddle 现在包括用不调用函数的语法编写的警报& 现在使用 shorted markup

于 2012-05-26T20:12:19.200 回答