我最近遇到了一个问题,虽然我为我解决了这个问题,但我不确定是否有更好的解决方案,所以我很感激任何意见。
问题。我想创建一个“ScrollIntoView”绑定。由于将元素滚动到视图中需要 DOM 元素,因此我编写了一个自定义绑定,然后我想在我高兴的时候显式地触发它。我从这段代码开始:
ko.bindingHandlers.scrollTo = {
update: function (element, valueAccessor, allBindings) {
var _value = valueAccessor();
var _valueUnwrapped = ko.unwrap(_value);
if (_valueUnwrapped) {
element.scrollIntoView();
}
}
};
绑定:
<div data-bind="scrollTo: goToThis">
在 ViewModel 我有这个可观察的:
_self.goToThis = ko.observable(false).extend({notify: 'always'});
然后我可以通过调用来触发:
_self.goTohis(true);
到目前为止,一切都很好。但是我很快遇到了问题。因为每当我将 goTothis() Observable 设置为 true 时,true 值就会一直存在,这导致一些元素滚动到视图中,而用户没有明确地触发它。例如,当我更改视图时,基本上用 if 绑定隐藏了所有元素,然后切换回来,if 绑定将重新触发之前设置为 true 的所有 goToThis 可观察对象。啊!
所以我想出了这个模式并像这样扩展了我的 custum 绑定:
ko.bindingHandlers.scrollTo = {
update: function (element, valueAccessor, allBindings) {
var _value = valueAccessor();
var _valueUnwrapped = ko.unwrap(_value);
if (_valueUnwrapped) {
element.scrollIntoView();
// resets the trigger value to false. Otherwise there will be more and more ViewModels, where the value is true.
if (ko.isWriteableObservable(_value) && typeof (_valueUnwrapped) === 'boolean') {
_value(false);
}
}
}
};
基本上每次触发时都会重置布尔值。
所以我想我的问题是:有没有人写过 scrollIntoView 绑定?如果是,您是如何解决的?
一般来说,是否有编写触发器的模式?即我只想触发一个绑定,但没有真正的价值变化。
最好的问候 j