2011-06-28 35 views
11

我試圖移植一個現有的asp mvc應用程序來使用knockoutjs(純js/html),因爲我不再需要asp mvc中的任何功能。然而我可以預見的一個問題是我處理我的一些頁面的方式。KnockoutJS - 在主視圖中的多個部分視圖?

我有一個頁面,其中包含大約12個部分視圖,每個部分都有自己的模型。現在,隨着淘汰賽JS好像你應該只有真正有1個視圖模型/每頁觀點,但是我有頁面包含了大量的信息,這些部分將類似於:

  • 客戶詳細信息
  • 客戶地址
  • 客戶最近的訂單
  • 客戶卡
  • 客戶資金
  • ...

如果部分細節發生變化,使事情變得更加棘手,它需要更改另一部分中的數據。因此,讓我們說你刪除一張卡,然後告訴基金控制它不再有卡,所以不會有資金。 (這是一個抽象的例子,但希望能夠說明這一點)

所以我有點不確定如何在淘汰賽中做到這一點,因爲它寧願將它作爲一個大型模型,我會很高興做到這一點,但它包含很多信息。以及多種形式,因爲您可以更新您的地址而無需更新其他所有內容。

所以,我應該爲這個視圖製作一個大型模型並處理它?或者有沒有辦法讓觀點彼此交談?

+0

有沒有人有任何正常的教程一般Knockout,因爲我發現文件有點簡短,只有一些小例子。沒有什麼重要的像演示應用程序,它顯示它在多個頁面上工作等... – somemvcperson

+0

只是爲了向演示應用程序位添加一些上下文,我發現他們的網站有一些體面的例子,但他們似乎只使用視圖模型和視圖,從來不是模型,所以這個其他模型是什麼?否則它只是VVM ... – somemvcperson

回答

3

我的策略是使用一個大視圖模型。不管你怎麼說,局部視圖都是服務器端的概念,一旦所有事情都轉移到客戶端,那麼在單個頁面中就會有大量的數據信息。

但是爲了使事情易於管理,我確保每個Javascript操作代碼都是在它自己的Partial視圖中編寫的。這樣可以更輕鬆地跟蹤功能和各自的代碼。

因此,基本上你可以在主頁面中填充主要Customers數組對象,然後調用函數來填充分別在每個局部視圖中定義的細節,地址等。

+1

感謝您的迴應,有一件事仍然讓我擔心一個大型模型的風格是大型模型(即地址,卡)中的每個模型都是獨立保存的。然而,從我最初看起來,它看起來像你一次堅持整個模型...我必須寫任何習俗來做到這一點?或者只是將saveCard(index)saveAddress(index)暴露爲只是將其發送到服務器的方法而已? – somemvcperson

+0

不是真的。如果模型在較大的模型下,您只需確保在部分視圖內正確引用它們,例如'Add Card'。我還沒有真正測試過,因爲我最終將所有內容都放在單一視圖模型中。模型內沒有模型;不是一個很好的解決方案。 – neebz

+2

順便說一句,我只是意識到,你也可以應用多個綁定通過封裝你的局部視圖在一個div中,然後調用'ko.applyBinding(partialViewModel,「ID的div」)''。第二個參數描述應用綁定的位置。 – neebz

3

我會對一個怪物視圖模型提出警告,因爲它會創建一個緊密的耦合,您需要在複雜的應用程序中避免這種耦合。

更好的解決方案是在ko.subscribable之上建立一個pub/sub系統。通過管理對各種事件的訂閱,促進了視圖模型之間的通信。事先做好了一點工作,但是它將會帶來收益。

Here是一篇博客文章,對該主題進行了擴展。我強烈推薦這個博客。它是針對淘汰賽的挑戰和策略的極好資源。

相關問題