0

我正在用 Resthub 开发一个 web 应用程序,所以前端有一个backbone.js 堆栈。我需要调用一个方法,每次呈现一个新视图(也包括各种子视图)时,添加一些 Twitter-Bootstrap 特定的东西(帮助弹出框,一种快速帮助,它从全局 json 文件中获取它们的选项,所以帮助文本更容易维护)。

据我所知,没有每次渲染视图时都会触发的主干内置事件。

所以我的问题是:扩展所有视图的最简单方法是什么,以便在(隐式或显式)调用渲染方法时它们触发事件。我想扩展我的所有视图,因为我不想在我拥有的所有视图中手动触发此事件,因为它容易出错,所有开发人员都必须记住他们必须触发该事件。

4

1 回答 1

2

如果您想在调用 render 方法的所有情况下做某事(触发事件或其他任何事情),最直接的方法可能是在 Backbone 的源代码副本中更新 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”,然后可以在您调用 render/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 也应该可供您使用。

于 2013-08-27T20:14:51.653 回答