2011-12-30 139 views
2

刚开始使用backbone.js时,我注意到的一件事是我的许多模型,集合和视图都有一些非常相似的方法。我想重构它们&从提取的位置(/ lib?)调用它们。我去寻找文档和/或例子,并且对我发现的很少(特别是没有)感到惊讶。所以,几个问题:如何组织通用代码

  • 是否有一个原因,我忽略了为什么有这么几个骨干方法的例子排除在公共图书馆?
  • 在共享代码的骨干项目中是否存在标准/商定的位置?
  • 任何有助于存储常用方法的骨干类和/或常用插件?

任何想法赞赏 - 在此先感谢。

(EDIT)实施例加入:

从视图采取此代码。 (诚​​然它太短是实际价值的重构,但它的简单性使其成为一个简洁的例子)

destroy:() -> 
    @model.destroy() 
    @remove() 
    return false 

假设我想将它重构为:

destroy:() -> 
    restful_destroy_method(this) 

然后叫:

restful_destroy_method: (view) -> 
    view.model.destroy() 
    view.remove() 
    return false 

来自共同的库。任何理由为什么没有人似乎这样做?

+0

这可能有助于增加什么样的一个具体的例子你正在处理的通用代码。根据你在做什么,可能有几种不同的方法来解决这个问题。 – 2011-12-30 15:46:08

+0

*点头*不用担心抢劫。上面添加的例子 – PlankTon 2011-12-30 15:56:24

回答

5

这取决于具体情况以及您的常见代码。

在你的例子中,我可能会做的是创建一个更具体的视图来扩展。

道歉直JavaScript,我不像流利的CoffeeScript中使用它的答案。

DestroyableView = Backbone.View.extend({ 
    destroy: function() { 
     this.model.destroy(); 
     this.remove(); 
     return false; 
    } 
}); 

然后,而不是创建new Backbone.View() S,我会创造new DestroyableView()秒。 DestroyableView可能有其他常用功能,或者您可以创建几个不同的父定义并使用_.extend()将它们全部应用于单个对象。

+0

*点头*感谢您的答案。我唯一担心的是,在很多情况下,我非常喜欢混合匹配哪些方法。一个视图可能需要common destroy,send_to_panel,send_email方法,而另一个视图可能需要send_to_panel,play_video等。我想我可以创建一个共同的'extended_view',其中包含我可能想要在我的项目中的任何模型中使用的所有方法,但是我不确定如果我只使用一个小方块在任何给定的视图中扩展视图的方法。 – PlankTon 2011-12-30 16:10:21

+0

@unclaimedbaggage - 当然,你仍然可以这样做。你可以从许多不同的来源[扩展](http://documentcloud.github.com/underscore/#extend),每个来源定义自己的功能。 – 2011-12-30 16:14:01

+0

啊 - 我一直忘记JavaScript比我想像的更加强大。非常感谢。 – PlankTon 2011-12-30 16:21:19

1

您可以使用“基本视图”,它拥有通用的方法:

// Create a Basic View which have all generic methods 
var BasicView = Backbone.View.extend({ 
    restful_destroy_method: function() { 
     this.model.destroy(); 
     this.remove(); 
     return false 
    } 
}); 

// Create a view which herits the methods of BasicView 
var ExampleView = BasicView.extend({ 
    destroy: function() { 
     this.restful_destroy_method(); 
    } 
}); 

您可以在这里展示上的jsfiddle一个例子:http://jsfiddle.net/Atinux/YDMNg/