Você pode aprender muito lendo o código-fonte do discurso. Hoje eu encontrei um bom mixin que torna fácil receber uma notificação quando a janela do navegador é rolada. Aqui está o que aprendi …
Vincular a eventos de rolagem / toque do navegador é fácil:
App.Scrolling = Em.Mixin.create({
bindScrolling: function(opts) {
var onScroll, _this = this;
onScroll = function(){
return _this.scrolled();
};
$(document).bind('touchmove', onScroll);
$(window).bind('scroll', onScroll);
},
unbindScrolling: function() {
$(window).unbind('scroll');
$(document).unbind('touchmove');
}
});
Usando o mixin acima, você pode ligar / desligar para rolar eventos de qualquer visualização:
App.MyView = Ember.View.extend(App.Scrolling, {
didInsertElement: function() {
this.bindScrolling();
},
willRemoveElement: function() {
this.unbindScrolling();
},
scrolled: function() {
console.log('MyView was scrolled')
}
});
Provavelmente, os eventos de rolagem precisam ser depurados!
Os eventos de rolagem são acionados muito rapidamente, então o método scroll () da view acima será chamado como um louco. A única maneira sensata de fazer isso é debouncing . O Discourse faz isso adicionando uma função ao namespace do aplicativo. Supondo que tenhamos o nosso próprio, o mixin rolável pode usá-lo para controlar as notificações de rolagem:debounce()
App.debounce
App.Scrolling = Em.Mixin.create({
bindScrolling: function(opts) {
var onScroll, _this = this;
opts = opts || {debounce: 100};
if (opts.debounce) {
onScroll = App.debounce(function() { return _this.scrolled(); }, 100);
} else {
onScroll = function(){
return _this.scrolled();
};
}
$(document).bind('touchmove', onScroll);
$(window).bind('scroll', onScroll);
},
unbindScrolling: function() {
$(window).unbind('scroll');
$(document).unbind('touchmove');
}
});
Você pode encontrar a versão original (no discurso github rebo) [ https://github.com/discourse/discourse/blob/master/app/assets/javascripts/discourse/mixins/scrolling.js ]