我正在使用Resthub开发一个web应用程序,因此在前端有一个backbone.js堆栈。我需要调用一个方法,每次渲染一个新的视图(也是各种子视图),添加一些Twitter-Bootstrap特定的东西(帮助弹出窗口,一种快速帮助,从全局json文件中获取他们的选项,所以帮助文本更容易维护。
据我所知,每次呈现视图时都没有激活骨干内置事件。
所以我的问题是:扩展所有视图的最简单方法是什么,以便在(隐式或显式)调用render方法时触发事件。我想扩展我的所有视图,因为我不希望在我拥有的所有视图中手动触发此事件,因为它容易出错,并且所有开发人员都必须记住他们必须触发该事件。
答案 0 :(得分:2)
如果你想在调用render方法时为所有情况做某事(触发事件或其他任何事情),最直接的方法可能是更新Backbone源代码副本中的render方法(假设你想要的话)整个项目的行为)。 默认情况下,render方法只返回'this'
render: function() {
return this;
},
如果在渲染之前总是想要做某些事情,可以在渲染方法中添加它
render: function() {
//add your extra code/call
return this;
},
或者你也可以覆盖Backbone.View函数的原型并更新/创建你自己的版本
_.extend(Backbone.View.prototype, Backbone.Events, {
render: function() {
console.log('This is a test');
return this;
}
});
var testView = Backbone.View.extend({
});
var testview = new testView();
testview.render(); //displays This is a test
//any view rendered will now have the console log
更进一步,你可以添加你自己的渲染版本,称之为'myrender'和/或添加你自己的事件'myevent'然后可以在调用渲染之前/之后调用myrender
_.extend(Backbone.View.prototype, Backbone.Events, {
render: function() {
//console.log('This is a test');
this.mynewevent();
return this;
},
myrender: function() {
console.log('Pre-render work');
this.render();
},
mynewevent: function() {
console.log('New Event work');
}
});
var testView = Backbone.View.extend({
});
var testview = new testView();
//testview.render();
testview.myrender();
Underscore的扩展正在这里使用,因为Backbone依赖于Underscore,如果你使用Backbone,也可以使用Underscore。