敲除事件绑定意外行为

Knockout event binding unexpected behaviour

我有一个 DIV 上 scroll 事件的事件绑定。为了去除处理程序的抖动,我在我的模型上引入了一个函数来创建去抖动的处理程序,并且我在我的视图中绑定了这个工厂函数。

我希望我的工厂创建 debounced 函数并且 knockout 会将其绑定到事件。相反,似乎 knockout 会在每个事件触发时重新创建并调用我的 debounced 函数,因此 debouncing 根本不起作用。

我的看法

<div data-bind="event.scroll: getScrollHandler()"></div>

我的模型

var viewModel = {
  getScrollHandler: function(data, evt) {
    return debounceFunction(function(data, evt) {
      // dp the actual handling...
    });
  }
};

我希望 getScrollHandler 方法在绑定初始化时只执行一次,它会绑定返回的函数。

相反,knockout 似乎将其全部包装到一个新函数中,因此它会在每个滚动事件上运行。

它在 Knockout 中究竟如何运作?

更新

由于我使用的是 TypeScript 并且此处理程序是 class 的成员方法,因此我仅限于这种函数成员分配,我无法直接将去抖函数分配为成员(或实际上我可以,但只是以一些更丑陋的方式。

假设您有一个实现 similar to this one,它的想法是创建一个新函数,然后您可以使用该函数代替原始函数。尝试将您的代码更改为:

getScrollHandler: debounceFunction(function(data, event) { 
  ...
})

这将创建该函数一次,并且 re-use 每次激活滚动时都会创建该函数。