我一直在尝试将处理程序附加到我的一个Backbone视图中的resize事件。在做了一些研究后,我发现你只能将事件附加到视图的元素或其后代。
这对我来说是一个问题,因为我试图实现的视觉效果不可能使用纯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;
}
);
我的脸上会非常感谢任何帮助。
三江源, 亚历
答案 0 :(得分:25)
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()
函数。永远不要只用另一个替换视图。
答案 1 :(得分:4)
您可以让window.onresize触发自定义backbone.js事件,然后让视图或模型监听它以获取各种元素的自定义响应。
案例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});
}