2012-12-04 60 views
1

我意識到有很多解決方案,但我想知道社區的意見是什麼。在模型或集合構造函數中存儲模型或集合特定的視圖

我有一系列的模型和集合。每個模型都有許多視圖,如細節,編輯,打印,旁白,幫助等。集合的視圖通常具有相同的名稱(即:旁白,幫助等)。

我的一個要求是我需要在模塊中構造我的代碼。如果模塊未加載,應用程序應該沒有模塊功能的跟蹤。例如,如果用戶沒有權限查看,編輯其他用戶,則可能會發生這種情況。所以「用戶」模塊甚至不會被加載。

所以......

我想到了一個好地方來存儲視圖定義一個模型可能是模型的構造以及在集合的構造函數的集合。例如:

var User = (function(){ // module definition 

    // model definition 
    var Model = Backbone.Model.extend({ 
     initialize: function() { 
      // ... 
     } 
    },{ 
     Views: { 
      Details: Backbone.View.extend({ 
       // ... 
      }), 
      Aside: Backbone.View.extend({ 
       // ... 
      }), 
      Help: Backbone.View.extend({ 
       // ... 
      }) 
     } 
    }); 

    // collection definition 
    var Collection = Backbone.Collection.extend({ 
     model: Model, 
     initialize: function() { 
      // ... 
     } 
    },{ 
     Views: { 
      Aside: Backbone.View.extend({ 
       // ... 
      }), 
      Help: Backbone.View.extend({ 
       // ... 
      }) 
     } 
    }); 

    // add more code here 

    return { // make model and collection public 
     Model: Model, 
     Collection: Collection 
    }; 

})(); // end module definition 

我知道我可以有我的看法住在別處,但將這種做法有任何顯着的缺點,我可能不知道的?也許內存泄漏或不太明顯的東西?

謝謝!

+0

嗯......我想我的問題的一部分,對不起,如果這聽起來很基本,是:當創建一個實例時,將「視圖」對象複製一次每個實例,或者通過添加到構造函數是我確保這些定義只添加到內存一次? – luisgo

回答

0

我認爲你最好不要將你的視圖作爲「類方法」添加到你的模型和集合中。由於JavaScript的原型繼承的性質,因此對於您的模型類型,您不是真的將類方法添加到構造函數的屬性。至於這是否會導致內存泄漏等問題,我不能說。

我會反而說,除非你有一個不使用這個結構的令人信服的理由,你最好只是將你的視圖分組在

如果您的目標是模塊化您的代碼,我會利用類似require.jsMarionette modules的東西,或者將「相關」代碼分組到IIFE中。

如果您有興趣瞭解更多關於究竟發生了classProperties被傳遞到Backbone.Model.extend方法,那麼我會建議直接在annotated source期待。

+0

我不知道木偶。我會試試看。謝謝! – luisgo

0

看一看require.js。有了它,你應該可以添加處理模塊加載的邏輯。一般來說,你仍應該看看它,對於組織骨幹應用程序非常有用,尤其是text plugin

+0

我已經並將使用require.js模塊化我的應用程序:)但在單個模塊中,我將至少有一個模型,每個集合和視圖。所以..說我把上面的所有代碼放入一個require.js模塊,這樣做的方式,我把視圖放在構造函數中是有意義的嗎? – luisgo

+0

我不會那樣做。 MVC(或其他)的要點是將所有東西都分開。嘗試將所有內容都視爲單一組件。隨着應用程序的增長,您可能需要一個模型,而不是一個視圖或一個視圖,而是一個不同的模型。分開的東西,並找到另一種方式來啓用/禁用模塊。只需要在需求中禁用該模塊就足夠了。之後,您只需從應用程序中刪除對該模塊的引用(例如將按鈕隱藏到禁用的視圖) – Xerri

+0

我想我已經掛上了命名和放置應用程序的某些部分的位置。謝謝。你是對的。 – luisgo