2013-02-02 58 views
1

我一直在使用Spine.js和CoffeeScript深入JavaScript MVC很長一段時間。我從一段時間開發了Ruby on Rails,所以我理解模型,視圖和控制器應該分別處理什麼(基於我的溫和體驗)。但在Rails中,我們已經知道(一般來說)每個控制器基本上都是控制一堆視圖(或頁面)並一次處理一個或多個模型的東西。 (也許,如果我錯了,那麼糾正我,因爲我不是職業球員,我必須承認)。Spine.js真實世界的webapp結構

然而,我在建築學方面發現了一個與Spine完全不同的概念。我閱讀了它的文檔並將其插入其示例應用程序中。不幸的是,所有的Spine示例應用程序都展示瞭如何處理單個頁面應用程序,在現實世界中,「更大」的應用程序不再是這種情況。 (如果Spine只能用於「單頁應用程序」,請糾正我)。

假設有一個網站(或應用程序),它由許多頁/科/模塊如下:

1 - 一個主頁,顯示例如縮略圖基於列表 2 - 聯絡網頁 3 - 爲對當前用戶A簡檔管理頁(正常CRUD)

每一頁具有相同的主結構(或佈局)作爲鏈接到上述網頁,搜索輸入字段和一個註銷鏈路報頭(我已經知道登錄頁面應該是分開的,所以我不會在這裏詢問認證)。

這裏棘手的部分是我無法真正弄清楚如何將整個部分連接在一起,我一直在問自己一些問題,在Google和StackOverflow上搜索,但沒有明確的答案。

1 - 「必須」一個脊椎應用程序應用程序只能在一個頁面?我的意思是,修正了頁眉和頁腳,但帶有一個動態內容DIV,它根據用戶點擊標題的哪個標籤來加載和卸載視圖?或者我應該將每個頁面作爲獨立的脊柱應用程序處理?

2 - 我在一個頁面上有多個控制器嗎?例如,應用程序主控制器和導航控制器(標題)?

3 - 是否每個控制器都應該處理一個模型或與之相關的模型? (在示例中,它們之間始終存在1對1關係,如任務模型和任務控制器)。

4 - 我應該在哪裏存儲接口相關的狀態變量在我的應用程序。我應該創建一個「記住」當前用戶的模型,或者例如突出顯示哪個選項卡以供進一步參考?還是應該將它們存儲到控制器中?

5 - 如果它將是一個單頁面的應用程序(但有很多部分或模塊),我應該爲這個頁面中的每個加載部分有一個控制器嗎?

我知道這些對於更有經驗的程序員來說可能是微不足道的問題,但我真的不知道從哪裏開始。所以如果有人能引導我走向正確的軌道,那將是非常棒的。

在此先感謝!

DD

回答

0

我認爲這是一個很好的問題。我的回答會很寬泛,請耐心等待。

我的答案的本質是,您需要熟悉其他框架,以瞭解您選擇的人正試圖解決什麼問題。你的問題是可以理解的。其他人一直在努力,缺乏一種「適當」的方式來做一些共同的事情。解決方案是根據示例,包裝器/擴展和替代框架創建的。也許,你應該尋找與Backbone有關的信息,這激發了Spine的興趣,並且仍然與它相似。

正如您所說,您熟悉Rails的MVC。然後是Spine的MVC方法,它完全不同。這應該給你一個提示,即MVC(或者一般來說MV *)是一個廣泛的想法,它有很多不同的實現。好的,你可能會認爲Rails畢竟是一個基於請求的服務器端框架,Spine是一個基於事件的客戶端框架 - 所以差別是可以理解的。那麼,客戶端JavaScript框架也沒有統一。例如,所提到的Backbone具有所謂的Views,它實際上扮演着控制器的角色。所以我想,Spine的創作者所做的一件事就是將視圖重新命名爲控制器以清晰起見。用於JavaScript的MV *由Addy Osmani詳細解釋。 JavaScript框架還有a good overview

因此,Spine和Backbone的一個「問題」是它們並不指定任何體系結構。換句話說,他們不夠自以爲是。你可以使用它們作爲你想要的,這個事實讓人沮喪。下面我試着回答你的問題:

  1. 隨着脊柱,應用不需要是一個單頁的應用程序(SPA)。

您可以創建一個具有多個頁面的應用程序,每個頁面加載它自己的控制器。在這種情況下,您的視圖可以在服務器上呈現,並且您的模型可以從生成的JavaScript引導。如果您不想購買SPA,但仍希望組織JavaScript或具有一些可重用組件,這很好。

但是,從Spine的特徵集(例如路線)來看,它是在SPA的基礎上創建的。

  1. 對於一般的SPA和複雜的用戶界面,最好是將UI部件(小部件)分開。在脊椎中,控制者是這種分離的手段。所以是的,使用多個控制器並使用控制器嵌套。也許,應該有一個最高層的應用程序控制器。

  2. 這是不正確的(沒有技術限制),儘管single responsibility principle使事情變得更容易。

  3. 將這些變量存儲在相應級別的控制器中。如果需要觀察這些值,則將它們存儲爲模型,否則將它們存儲爲控制器屬性。

  4. 您可以擁有一個App控制器,它包含一個頁眉,頁腳,邊欄控制器和活動頁面。在Routes中,您創建一個相應的控制器並將其傳遞給App控制器,該控制器用該控制器的元素替換主區域內容。這是一種可能的方法。

再次:

人們都在骨幹/脊柱應用架構方面與缺乏具體性的掙扎。他們創建了一些解決方案,如應用程序控制器,佈局管理器等。對於Backbone,你可以看看Marionette,ChaplinThorax。通過向他們學習,您將能夠爲您的Spine應用程序提供一個架構。祝你好運!

+0

感謝您的回覆, 但是,如果我使用多頁面應用程序,我需要爲每個應用程序引導一個CoffeeScript類,是嗎?因此,如果我的主頁有index.coffee,我應該有例如profile.coffee來管理配置文件頁面中的控制器。是對的嗎? – DavidDev

+0

那麼,你確實需要在某處初始化至少一個頁面特定的控制器。如果只是幾行代碼 - 將其包含在頁面代碼中。否則,每個頁面使用一個單獨的腳本文件。 – Infeligo

+0

謝謝@infeligo的答案。這是很好的頭腦風暴和與你討論。乾杯! – DavidDev