2011-12-30 75 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/