在下面的小提琴中: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());
答案 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
函数现在只是翻转该数字。