Knockout js 和 Raven DB

3

我目前正在开发一个基于NoSQL(使用Raven DB)的应用程序。该应用程序的核心方面是树状数据结构,包括许多节点、子节点等。

目前,每个节点或子节点都由C#对象表示。在父节点上,使用子节点集合来建立父子关系,即一种仅向前的关系。

整个过程都由自定义表单处理,在Mvc应用程序中,对于每种数据类型,使用适当的GET和POST。整个图形存储为JSON在Raven DB上。

现在的目标是使用knockoutjs修改UI部分。由于KO也可以使用JSON数据结构,我想知道是否有一种方法可以使RavenDB JSON结构“兼容”knockout,这意味着我可以直接使用它,而不必创建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多个类)。


我没有使用过Raven DB,但如果它生成的JSON看起来类似于NewtonSoft.Json.JsonConvert.SerializeObject(Object)的返回结果,那么我想应该不会有问题。 - Major Byte
2个回答

4

您可以查看Knockout-mapping-plugin。它可以通过一次调用“自动”生成与Knockout兼容的视图模型。

您只需执行以下操作即可:

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结构,而是一个标准的CLR对象序列化为JSON。

如果你想直接与Raven工作,你必须直接将你的应用程序连接到Raven的接口 - 这不是一个好主意(但当然在性能方面应该很好)。

2)我不认为仅仅使用knockout mapping插件将你的模型对象作为ViewModels是一个好主意。

很快你将需要在视图模型中添加一些逻辑。无论是计算要在视图中显示的值,还是添加一些操作逻辑(保存/编辑等)。

对于第一种情况,你可以在服务器端定义你的视图模型并使用映射插件。

对于后面的部分,你无论如何都必须在JavaScript中编写视图模型。我建议直接开始使用JavaScript编写视图模型。

这对我来说是最好的选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接