Как добавить событие изменения размера к окну в представлении с использованием Backbone?
Я пытаюсь привязать обработчик к событию изменения размера в одном из моих представлений Backbone. После некоторых исследований я обнаружил, что вы можете прикреплять события только к элементу представления или его потомкам.
Это проблема для меня, потому что визуальный эффект, который я пытаюсь достичь, невозможен с использованием чистого CSS и требует, чтобы некоторые JS устанавливали размеры элемента области содержимого на основе окна минус элемент заголовка.
Если у вас возникли проблемы с визуализацией того, что я пытаюсь сделать, представьте тонкий заголовок и область содержимого, которая должна занимать оставшееся пространство без фонового трюка CSS;)
Я прикрепил пример кода. Если у вас есть другие указатели, я также хотел бы их услышать!
define(
[
'jQuery',
'Underscore',
'Backbone',
'Mustache',
'text!src/common/resource/html/base.html'
],
function ($, _, Backbone, Mustache, baseTemplate) {
var BaseView = Backbone.View.extend({
el: $('body'),
events: {
'resize window': 'resize'
},
render: function () {
var data = {};
var render = Mustache.render(baseTemplate, data);
this.$el.html(render);
this.resize();
},
resize: function () {
var windowHeight = $(window).height();
var headerHeight = this.$el.find('#header').height();
this.$el.find('#application').height( windowHeight - headerHeight );
}
});
return new BaseView;
}
);
Любая помощь будет очень благодарна моему лицу.
Thankyou,
Alex
Ответы
Ответ 1
var BaseView = Backbone.View.extend({
el: $('body'),
initialize: function() {
// bind to the namespaced (for easier unbinding) event
// in jQuery 1.7+ use .on(...)
$(window).bind("resize.app", _.bind(this.resize, this));
},
remove: function() {
// unbind the namespaced event (to prevent accidentally unbinding some
// other resize events from other code in your app
// in jQuery 1.7+ use .off(...)
$(window).unbind("resize.app");
// don't forget to call the original remove() function
Backbone.View.prototype.remove.call(this);
// could also be written as:
// this.constructor.__super__.remove.call(this);
}, ...
Не забудьте вызвать функцию remove()
на представлении. Никогда не заменяйте вид другим.
Ответ 2
Вы можете позволить window.onresize запускать пользовательский backbone.js, а затем позволить Views или Models слушать это, чтобы иметь настраиваемые ответы для различных элементов.
Случай 1.. Просмотр напрямую просматривает событие окна.
window.onload = function() {
_.extend(window, Backbone.Events);
window.onresize = function() { window.trigger('resize') };
ViewDirect = Backbone.View.extend({
initialize: function() {
this.listenTo(window, 'resize', _.debounce(this.print));
},
print: function() {
console.log('Window width, heigth: %s, %s',
window.innerWidth,
window.innerHeight);
},
});
var myview = new ViewDirect();
}
Случай 2.. Вы можете сохранить размер окна, не проверяя его каждый раз, когда вам это нужно, поэтому вы сохраняете размер окна в базовой модели: в этом случае оконная модель прослушивает окно, в то время как представление прослушивает модель окна:
window.onload = function() {
_.extend(window, Backbone.Events);
window.onresize = function() { window.trigger('resize') };
WindowModel = Backbone.Model.extend({
initialize: function() {
this.set_size();
this.listenTo(window, 'resize', _.debounce(this.set_size));
},
set_size: function() {
this.set({
width: window.innerWidth,
height: window.innerHeight
});
}
});
ViewWithModel = Backbone.View.extend({
initialize: function() {
this.listenTo(this.model, 'change', this.print);
...
},
print: function() {
console.log('Window width, heigth: %s, %s',
this.model.width,
this.model.height);
},
});
var window_model = new WindowModel();
var myview = new ViewWithModel({model: window_model});
}