我想在knockout.js自定义绑定中使用变量。特别是在init
回调中的事件处理程序中。
示例:
ko.bindingHandlers.test = {
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
var $element = $(element);
var f = valueAccessor();
$element.mousedown(function(e) {
f = true;
});
},
update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
var f = valueAccessor();
}
};
型号:
var ViewModel = function() {
this.flag = false;
};
这是fiddle。
问题是:如果在元素上触发mousedown
,则flag
未在模型中更新。
问题在于这一行:
var f = valueAccessor();
复制值而不是参考。布尔是原始人。
我可以使flag
可观察,因此它是一个函数,我在处理程序中有引用。但我不想要一个可观察的...我只是不需要'通知听众改变'这里的功能。
我还可以做一个包装函数或其他东西......但是......一个函数只是为了得到一个布尔的引用?
我需要此功能才能报告绑定的“状态”。外部函数有时需要这些信息,但他们不希望在价值变化时注意到结果。
是否有最佳做法或什么?
答案 0 :(得分:1)
关于
我只是不需要在这里通知听众更改' -feature
如果这是一个足够强大的理由不使用可观察的话。如果您使用可观察的实际优势,是否存在任何实际缺点
Knockout充满了可观察性和其他更复杂的东西。如果你"保存"你真的没有任何收获。一个可观察的。毕竟,在它们提供好处的地方使用它们,这就是框架的用途。
如果你没有观察者的订阅者而只是为了保持某种内部状态而使用它 - 这是使用观察者的完美理由。
如果你绝对,肯定必须避免使用observable,你可以传递viewModel属性的名称:
ko.bindingHandlers.test = {
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
var propertyName = valueAccessor();
$(element).mousedown(function(e) {
viewModel[propertyName] = true;
}).mouseup(function(e) {
viewModel[propertyName] = false;
});
}
};
和
<input type="text" data-bind="test: 'flag'">