我目前正在开发一个基于no-sql的应用程序(使用raven db)。该应用程序的核心方面是树状数据结构,包含许多节点,子节点等。
目前,每个节点或子节点都由c#对象表示。使用父节点上的子节点集合(仅向前关系)建立父子关系。
整个事情由临时表单在Mvc应用程序中处理,每种数据类型都有适当的GET和POST。整个图表在Raven DB上存储为JSON。
现在的目标是使用knockoutjs修改UI部分。由于KO也适用于json数据结构,我想知道是否有办法使ravendb json结构“淘汰兼容”,这意味着我可以直接使用它而无需制作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 :(得分: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对象。
答案 1 :(得分:0)
是的,您可以使用Knockouts Mapping功能并直接从模型对象创建ViewModel。但是,我有两点:
1)我认为对象存储在RavenDB中的事实并不存在。您的MVC应用程序从RavenDB中检索对象 - 因此它们从JSON反序列化,而不是通过REST接口提供给您的JS页面,因此它们再次序列化为JSON。所以你没有直接使用RavenDB的JSON结构,它是一个序列化为JSON的标准CLR对象。
如果你想直接使用Raven,你必须直接将你的应用程序插入到raven的界面 - 这不是一个好主意(当然,在性能方面,它应该很好用)。
2)我不认为使用模型对象作为ViewModel是好主意,只能使用knockout mapping插件。
很快你需要为视图模型添加一些逻辑。要么计算要在视图中显示的值,要么添加一些动作逻辑(保存/编辑......等)。
对于第一种情况,您可以在服务器端定义视图模型并使用映射插件。
对于后者,无论如何你必须用javascript编写视图模型。我建议你开始直接在javascript中编写viewmodels。
对我来说效果最好。