gpt4 book ai didi

javascript - 在自定义绑定(bind)处理程序中使用不可观察量

转载 作者:行者123 更新时间:2023-11-28 01:00:57 25 4
gpt4 key购买 nike

我想使用 knockout.js 自定义绑定(bind)中的变量。特别是在 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();

复制的是值而不是引用。 bool 值是基元。

我可以使 flag 可观察,所以它是一个函数,并且我在处理程序内有引用。但我不想要一个可观察的...我只是不需要这里的“通知监听器变化”功能。

我也可以做一个包装函数或其他东西......但是......一个函数只是为了获取 bool 值的引用?

我需要此功能只是为了报告我的绑定(bind)的“状态”。外部函数有时需要此信息,但它们不希望在值更改时引起注意。

有最佳实践吗?

最佳答案

关于

i just don't need the 'notify listeners on change'-feature here

想一想这是否是不使用可观察对象的充分理由。如果您使用可观察到的东西,是否有任何实际缺点?如果不使用,是否有实际优点

knockout 充满了可观察到的东西和其他更复杂的东西。如果你“保存”一个 observable,你并不会真正获得任何东西。毕竟,在它们提供好处的地方使用它们,这就是框架的用途。

如果您没有 observable 的订阅者,并且只是出于方便而使用它来保存某种内部状态 - 这就是使用 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'">

关于javascript - 在自定义绑定(bind)处理程序中使用不可观察量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25641755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com