【问题标题】:Not able to trigger Knockout data-bind using jQuery无法使用 jQuery 触发 Knockout 数据绑定
【发布时间】:2015-10-13 17:48:19
【问题描述】:

我正在使用 jQuery 和 Knout 编写插件。我有两个单选按钮。我正在使用敲除数据绑定来检查和取消选中单选按钮。问题是,当我尝试使用 jQuery 取消选中单击另一个按钮时的单选按钮时,它不会更新 bind observable property 。

<input  type="radio" data-bind="checked: selectedVal" name="1" value="fixedPrice"/>  Fixed Price
 <input class="hn" type="radio" data-bind="checked: selectedVal" name="1" value="allowBiding"/> Allow Biding
<pre data-bind="text:ko.toJSON($data,null,2)"></pre>
<input type="button" id="button" value="Click Me" />

 var onClick = function() {
   $('.hn').prop('checked', true);

};

$('#button').click(onClick);

var ViewModel = function () {
    var self = this;
    self.selectedVal = ko.observable("fixedPrice");
    self.selectedVal.subscribe(function (val) {
       console.log(val)
    });
};

ko.applyBindings(new ViewModel());

请在下方找到this jsfiddle 了解更多详情。

【问题讨论】:

    标签: javascript jquery knockout.js knockout-2.0 knockout-mvc


    【解决方案1】:

    jQuery 和 Knockout 正在争夺对视图的控制权。如果您要使用视图模型,请使用视图模型并且不要操作 DOM,除非通过视图模型。您有一个控制单选按钮的视图模型元素,您只需要设置它。 Knockout 提供了 click 绑定,因此您也不需要 jQuery 来附加它。

    var ViewModel = function () {
        var self = this;
        self.selectedVal = ko.observable("fixedPrice");
        self.selectedVal.subscribe(function (val) {
            console.log(val)
        });
        self.setSelected = function () {
            self.selectedVal('allowBiding');
        };
    };
    
    ko.applyBindings(new ViewModel());
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
    <input type="radio" data-bind="checked: selectedVal" name="1" value="fixedPrice" />Fixed Price
    <input type="radio" data-bind="checked: selectedVal" name="1" value="allowBiding" />Allow Biding
    <pre data-bind="text:ko.toJSON($data,null,2)"></pre>
    
    <input type="button" value="Click Me" data-bind="click:setSelected" />

    【讨论】:

      【解决方案2】:

      哎呀!不要以这种方式混合 KO 和 jQuery。你是在战斗淘汰赛,而不是使用它。请参阅this earlier answer I wrote 了解非常相似的情况和扩展说明。

      请注意,这肯定是不是一个错误,jQuery默认会触发这样的DOM更改事件。如果您坚持以这种方式混合 KO 和 jQuery,请务必这样通知其他人:

      ko.applyBindings({
        isChecked: ko.observable(false),  
        onClick: function() {
          $('.hn').prop('checked', true);
          $('.hn').trigger('click');
        }
      });
      <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      
      1. The radio button: <input type="radio" class="hn" data-bind="checked: isChecked">
      <br>
      2. Trigger it with jQuery: <button data-bind="click: onClick">trigger</button>
      <hr>
      Debug info:<br><textarea data-bind="text: ko.toJSON($root)"></textarea>

      【讨论】:

      • @Dandy 我希望你只是为了满足好奇心而尝试它,而不是打算使用它。这是一种反模式。
      • @RoyJ 是的,我知道罗伊。只是出于好奇。
      • 在单选按钮上调用click 已经改变了它的值,所以你不应该改变checked 的值然后调用click
      • @MichaelBest 我认为你是对的,但是当我试图删除它时,我注意到 KO 没有看到实际的变化。我已经更新了我的答案。如果您更改我的堆栈 sn-p 并删除 prop 调用,那么 Knockout 将不会更新 trigger 上的视图模型。
      【解决方案3】:

      它看起来像一个错误。但是,您可以尝试调用本机点击处理程序,以便更新 observable。

      $('.hn').triggerHandler('click');
      

      或者

      $('.hn')[0].click();
      

      这是JsFiddle Demo

      【讨论】:

      • 这不是错误。正如您所注意到的,Knockout 响应事件,而不是通过 JavaScript 手动更改 checked 属性。
      • '$('.hn')[0].click();'非常适合我。需要它作为我设置的自动化视觉回归测试工具的一部分运行。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2013-07-31
      • 2023-03-07
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 2016-12-09
      • 2015-03-25
      相关资源
      最近更新 更多