使用Ember.run.debounce Debouncing Scroll

时间:2014-03-03 22:06:20

标签: javascript ember.js

我有一个工作滚动mixin(你可以在这个要点中看到)。

http://jsbin.com/wofaj/4

App.Scrolling = Em.Mixin.create({
  bindScrolling: function() {
    var onScroll;
    var _this = this;

    var scrollFunc = function(){ 
       return _this.scrolled(); 
    };

    onScroll = scrollFunc;

    $(document).bind('touchmove', onScroll);
    $(window).bind('scroll', onScroll);
  },

  unbindScrolling: function() {
    $(window).unbind('scroll');
    $(document).unbind('touchmove');
  }
});

App.ApplicationView = Ember.View.extend(App.Scrolling, {
    didInsertElement: function() {
        this.bindScrolling();
    },
    willRemoveElement: function() {
        this.unbindScrolling();
    },
    scrolled: function() {
      console.log('MyView was scrolled : ' + document.body.scrollTop);
    }
});

但我相信建议使用Ember运行循环(特别是去抖动 - http://emberjs.com/api/classes/Ember.run.html#method_debounce)去抖动。

此处的非工作代码示例:

http://jsbin.com/wofaj/5

问题代码在这里:

onScroll = Ember.run.debounce(this, scrollFunc, 200);

不幸的是,无论我使用什么上下文,我似乎无法让它发挥作用。

非常感谢一些见解。

谢谢,

克里斯

2 个答案:

答案 0 :(得分:3)

如果将onScroll分配给函数

,它将起作用
onScroll = function(){Ember.run.debounce(this, scrollFunc, 200);};

http://jsbin.com/qoxulomo/1

答案 1 :(得分:0)

在Ember中去抖动功能的另一种方法如下:

App.Scrolling = Em.Mixin.create({
    timer: null,

    scrollBinding: function() {
        this.set('timer', Em.run.debounce(this, this._scrollFunction, 100));
    },

    _scrollFunction: function() {
        // This function will run after 100ms after scrolling stops
    },
});