2013-08-17 52 views
4

我是新來的knockout.js。幾分鐘後,我讀了ko的標題特徵。 我無法理解的是ko真的MVVVM?因爲他們所談論的只是數據綁定以及它的易用性。但我相信MVVM不僅僅是數據綁定?knockout.js真的採用MVVM模式嗎?

回答

8

是的,knockout.js的確應用了MVVM模式。 It's explained in the documentation

  • 一個模式:應用程序的存儲的數據。這些數據代表您的業務領域中的對象和操作(例如,可以執行匯款的銀行賬戶),並且獨立於任何用戶界面。使用KO時,通常會對某些服務器端代碼進行Ajax調用,以讀取和寫入此存儲的模型數據。

  • A 查看模型:在UI上的數據和操作的純代碼表示。例如,如果你正在實現一個列表編輯器,你的視圖模型將是一個擁有項目列表的對象,並且展示添加和移除項目的方法。

    請注意,這不是UI本身:它沒有任何按鈕或顯示樣式的概念。它不是保存的數據模型 - 它保存用戶正在使用的未保存的數據。在使用KO時,您的視圖模型是純粹的JavaScript對象,不掌握HTML。以這種方式保持視圖模型的抽象可以讓它保持簡單,所以你可以在不迷路的情況下管理更復雜的行爲。

  • 視圖:表示視圖模型的狀態的可見,交互式用戶界面。它顯示來自視圖模型的信息,向視圖模型發送命令(例如,當用戶單擊按鈕時),並且在視圖模型的狀態改變時更新。

    當使用KO時,您的視圖就是您的HTML文檔,它帶有聲明式綁定以將其鏈接到視圖模型。或者,您可以使用使用視圖模型中的數據生成HTML的模板。

+0

MVVM的模型可以在服務器端(即C#類),它的視圖模型可以在JavaScript中嗎?數據將使用AJAX查詢,而C#類具有以JSON形式出現的屬性,或者整個類被序列化爲JSON。因爲我看到的實現是這樣做的。這是對的嗎? –

+0

是的,這很常見。 [映射插件](http://knockoutjs.com/documentation/plugins-mapping.html)將幫助您創建或更新基於您的服務器端模型的ViewModel。 – sroes

2

除了已經給出了答案,有幾件事情要記住 -

MVVM

淘汰賽是MVVM因爲它支持關注點分離效果好。與其他JavaScript庫(如jQuery)不同,它的目標是不污染與其無關的視圖。

view model的目的很重要。它不會嘗試操作DOM,因爲只有將視圖中的數據提供給其視圖的邏輯才放在其中。

view的目的只是爲了呈現(渲染)數據。沒有邏輯,驗證或其他邏輯代碼在這裏。

model是Knockout可能會有點棘手的唯一地方。在您的項目中添加一個單獨的model以供使用,但是許多開發人員已經發現將model混合到view model中很容易。原因很明顯(一些model是非常基本的),但這只是出於易於實施。

MVC VS MV *

當然也有對SO.com是試圖回答什麼是MV*其他的答案,但我希望把我的$ 0.02這裏 - 其他庫或框架說話的事實,他們是MVCMVPMV(whatever)的基礎,但Knockout是我發現的唯一一個實踐它在這方面宣揚的東西。如果你有時間和期望看看Angular或Ember等其他框架的結構,並且你會看到存在一條模糊的線條,或多或少它們只是使用基於MVVM的模式,但將其稱爲不同的模式。

+0

嗯,jQuery也允許你寫不引人注目的Javascript,例如[像這樣](http://jsfiddle.net/UJHuP/)。 – Jeroen

+1

允許與支持 - 美國政府'允許'你進行犯罪活動,但它不'支持'說的行爲。 –

+1

o.O「*政府允許您進行犯罪活動*」?無論如何,我認爲我創建的例子顯示了jQuery的巨大用處,以創建不顯眼的數據綁定。 [與KO一樣的練習](http://jsfiddle.net/BxCVk/1/)甚至更突兀,我會爭辯說。不要誤解我的意思,我喜歡KO,但我認爲jQuery *可以*幫助你編寫不引人注目的代碼併爲自己的目的服務。 – Jeroen

0

嗯,我想它可以,但是我正在一個項目中,所有樣式和用戶界面佈局操作都是在淘汰js ViewModel文件中完成的,這不是一個好的做法。