2011-12-24 84 views
3

如何使它在每次backbone.js视图初始化时都运行一个函数?当初始化主干视图时

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

这个想法是减少样板的数量。

谢谢。

回答

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

它并不像一个优雅的解决方案,可能与其他语言,但它的工作。

+0

是的,这就是我现在要做的。这是一个可接受的/好的解决方案。 – Harry 2011-12-25 05:52:54

1

您可以使用Backbone.Events。

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

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

而且在你希望触发功能的视图的初始化方法:

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

其中“这个”是作为函数的“view”参数传递的视图实例。

+1

没有内置事件,所以这意味着手动触发,这并不理想。 – Harry 2011-12-24 23:37:52

+0

为什么触发自定义事件并不理想? – ProTom 2011-12-25 10:28:24

3

使用内置Backbone.js的初始化函数:

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

var ItemView = Backbone.View.extend({ 
    initialize: function(){ 
    alert('View Initialized'); 
    } 
}); 

编辑:我应该更清楚。

在尤因的话在这里找到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"

鸭冲床(或猴补丁,如果你喜欢)骨干对象。

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

问题在于,当您创建新视图时,您将覆盖覆盖 – Harry 2011-12-25 05:54:00

+0

只有在视图中定义初始化函数时才会覆盖覆盖。 – 2011-12-25 06:10:52

+4

您可以在覆盖中调用您的超级方法。 ClassYouExtend.prototype.initialize.call(本);并且你的父母初始化将会被调用。 – ProTom 2011-12-25 10:33:18