【问题标题】:How to update knockout binding with jQuery?如何使用 jQuery 更新淘汰赛绑定?
【发布时间】:2013-09-23 06:35:35
【问题描述】:

在下面的小提琴中:http://jsfiddle.net/3Lqsx/2088/

我已将第二个按钮绑定到反转计数器方向的功能。

如果我单击该按钮,则在单击第一个按钮一次之前,新绑定不会应用。它应该立即生效。

如何强制此新绑定立即生效?

代码:

var ClickCounterViewModel = function() {
this.numberOfClicks = ko.observable(0);

this.registerClick = function() {
    this.numberOfClicks(this.numberOfClicks() + 1);
};

this.changeClickBinding = function() {
     $('#clicker').attr('data-bind', 'click: function(){numberOfClicks(numberOfClicks() - 1)}');
};

this.resetClicks = function() {
    this.numberOfClicks(0);
};

this.hasClickedTooManyTimes = ko.computed(function() {
    return this.numberOfClicks() >= 3;
}, this);
};

ko.applyBindings(new ClickCounterViewModel());

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    一般来说,在调用applyBindings 之后尝试动态更改绑定并不是一个好主意。该函数是 Knockout 用来评估 data-bind 属性中的代码的函数。如果您之后更改它们,您将获得的行为没有定义(据我所知)。

    此外,您将 jQuery 和 Knockout 混合用于 DOM 更新和事件处理,这可能会导致以后的代码混乱。 Knockout 可以为您处理这一切:

    var ClickCounterViewModel = function() {
      this.numberOfClicks = ko.observable(0);
      this.clickDirection = ko.observable(1);
    
      this.registerClick = function() {
        this.numberOfClicks(this.numberOfClicks() + this.clickDirection());
      };
    
      this.changeClickBinding = function() {
        this.clickDirection(this.clickDirection() * -1)
      };
    
      this.resetClicks = function() {
        this.numberOfClicks(0);
      };
    
      this.hasClickedTooManyTimes = ko.computed(function() {
        return this.numberOfClicks() >= 3;
      }, this);
    };
    
    ko.applyBindings(new ClickCounterViewModel());
    

    我添加了一个新的 observable,clickDirection,来控制计数器是递增还是递减。 changeClickBinding 函数现在只是翻转该数字。

    【讨论】:

    • 我需要通过 jQuery 来完成,因为我有一个带有 Razor 生成属性的 MVC 视图。我知道可以/应该通过淘汰赛来完成,但在这种特殊情况下,我认为这不是一个选择。这是一个更详细的问题:stackoverflow.com/questions/18946638/…
    • 我能理解你为什么要这样做,但你的问题仍然是你试图将 Knockout、jQuery 和服务器端模板混合在一起,这使得使用 Knockout 变得困难.这导致您尝试使用 jQuery 更新绑定,而 KO 无法很好地处理。我工作的公司也面临着类似的问题,并且已经开始将所有数据写入页面上的 JSON 对象,并使用 KO 绑定所有内容。
    • 我不能这样做,因为初始页面及其内容需要非 JS 用户查看并且搜索引擎可以抓取:/ 我很惊讶没有办法“重新- 在这个新元素中应用 ko 绑定
    • 您可以尝试调用 cleanNode,然后再次 applyBindings,但这并不总是对我有用。
    • 在服务器端生成一个“静态”初始页面(搜索引擎或 JS 阻止的用户会看到),让您的 JS 代码最初删除服务器生成的元素,然后使用 KO 生成就像 JeffB 所说的那样,他们最初的替代品。
    猜你喜欢
    • 2014-10-30
    • 2017-05-11
    • 1970-01-01
    • 2012-04-20
    • 2014-01-08
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多