如何使用jQuery更新knockout绑定?

时间:2013-09-22 19:19:37

标签: knockout.js

在下面的小提琴中: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());

1 个答案:

答案 0 :(得分:0)

通常,在调用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函数现在只是翻转该数字。