2011-09-01 84 views
3

我目前正在開發基於no-sql的應用程序(使用raven db)。這個應用程序的核心部分是一個具有許多節點,子節點等的樹狀數據結構。Knockout js和Raven DB

當前,每個節點或子節點都由c#對象表示。父 - 子關係由父節點上的一組子節點構成,這是一種只向前關係。

整個事情由臨時表單處理,在Mvc應用程序中,爲每種數據類型提供適當的GET和POST。整個圖形在Raven DB上以JSON形式存儲。

現在我們的目標是使用knockoutjs修改UI部分。由於KO也適用於json數據結構,所以我想知道是否有一種方法可以使ravendb json結構「knockout compatible」,這意味着我可以直接使用它而不必創建KO特定的結構(以實現可觀察性等)然後創建兩者之間的映射。

對象圖的示例:

public class NodeA 
{ 
public string Name {get;set;} 
public List<SubNode> Childs {get;set;} 
} 

public class SubNode 
{ 
public string Name {get;set;} 
public bool SomeBool {get;set;} 
} 

public class NodeB 
{ 
public string Name {get;set;} 
public int SomeInt {get;set;} 
} 

public class GraphToStore 
{ 
public List<NodeA> NodeAList {get;set;} 
public List<NodeB> NodeBList {get;set;} 
} 

東西沾到了UI更新後的讀/寫部分仍然會處理服務器端,用ajax調用。驗證將在服務器端,並通過ajax調用返回給客戶端。我的問題正如我所說的使ravendb json與knockoutjs一起工作,否則我不得不重構整個事物並映射它,而且圖形非常龐大(超過50個班級)。

+0

我沒有體驗過Raven DB,但是如果它生成的JSON看起來和NewtonSoft.Json.JsonConvert.SerializeObject(Object)的返回類似,那麼我猜測它是沒有問題的。 –

回答

4

看看Knockout-mapping-plugin。它將「自動地」通過一次調用生成分解兼容的視圖模型。

之後,你有這方面的工作,斷點調用映射後,探索數據結構,你會做這樣的事情

var viewModel.myRavenDbData = ko.mapping.fromJSON(json data variable); 
var unwrappedData = viewModel.myRavenDbData(); // need only if viewModel.myRavenDbData is an observable 

。一般來說,它將看起來像你的數據結構與ko.observables的實際值。導航所需的所有節點將是正常的JavaScript對象。

0

是的,您可以使用Knockouts Mapping功能,並直接從模型對象創建ViewModels。但是,我有兩點:

1)我認爲,對象存儲在RavenDB的事實不會改變。您的MVC應用程序從RavenDB中檢索對象 - 因此它們是從JSON反序列化的,而不是通過REST接口將它們提供給JS頁面,因此它們將再次序列化爲JSON。所以你不直接使用RavenDB的JSON結構,它是一個序列化爲JSON的標準CLR對象。

如果你想直接使用Raven,你必須直接將你的應用程序插入到raven的界面 - 這不是一個好主意(但當然,在性能上它應該很好)。

2)我不認爲使用模型對象作爲ViewModels是好主意,只能使用knockout貼圖插件。

不久,您需要添加一些邏輯到視圖模型。可以在視圖中顯示計算值,也可以添加一些操作邏輯(保存/編輯...等)。

對於第一種情況,您可以在服務器端定義您的視圖模型並使用映射插件。

對於以後,你將不得不在JavaScript中編寫視圖模型。我會建議直接在JavaScript中編寫viewmodels。

它對我最好。