初始化骨干视图时

时间:2011-12-24 22:45:40

标签: javascript javascript-events backbone.js

如何在每次初始化backbone.js视图时运行函数?

我正在寻找一些我可以放在普通视图代码之外的东西,作为backbone.js的扩展。

这个想法是减少样板量。

感谢。

3 个答案:

答案 0 :(得分:3)

由于Javascript不是真正面向对象的编程语言,因此如果是java或c#,就不能使用继承来解决问题。

一种可能的解决方案是使用工厂设计模式。

您可以调用将实例化视图的工厂方法,而不是直接实例化视图。

var viewFactory = function(view, viewOptions) {
  //perform your boilerplate code
  return new view(viewOptions);
}

AView = Backbone.View.extend({});

var person = new Backbone.Model({name: 'Paul'});
var view = viewFactory(AView, { model: person });

这是jsfiddle example

它不是一种可以与其他语言一起使用的优雅解决方案,但它可以完成这项工作。

答案 1 :(得分:3)

使用builtin backbone.js初始化函数:

http://documentcloud.github.com/backbone/#View-constructor

var ItemView = Backbone.View.extend({
  initialize: function(){
    alert('View Initialized');
  }
});
编辑:我应该更清楚。

用Patrick Ewing的话来http://podcast.rubyonrails.org/programs/1/episodes/railsconf-2007

"if it walks like a duck and talks like a duck, it’s a duck, right? So if this duck is not giving you the noise that you want, you’ve got to just punch that duck until it returns what you expect"

Duck Punch(如果你愿意,可以使用Monkey Patch)Backbone对象。

Backbone.View.prototype.initialize = function(){
  alert('I overrode the default initialize function!');
}

答案 2 :(得分:1)

您可以使用Backbone.Events。

在应用的顶层或全局对象上:

app.eventManager = {};
_.extend(app.eventManager, Backbone.Events);
app.eventManager.bind("newView", app.yourfunction(view));

在任何视图的initialize方法中,你想触发你的函数:

app.eventManager.trigger("newView", this);

其中“this”是作为“view”参数传递给您的函数的视图实例。