Knockout js and Raven DB

本文关键字:DB Raven and js Knockout | 更新日期: 2023-09-27 18:07:28

我目前正在开发一个基于no-sql的应用程序(使用raven db)。该应用程序的核心方面是具有许多节点、子节点等的树状数据结构。

目前,每个节点或子节点都由c#对象表示。父子关系是由父节点上的一组子节点组成的,这是一种仅向前的关系。

整个事情是由Mvc应用程序中的特殊表单处理的,每种数据类型都有适当的get和post。整个图以JSON形式存储在Raven DB上。

现在的目标是使用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+类)。

Knockout js and Raven DB

看看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

在此工作之后,在调用映射后断点并探索数据结构。一般来说,它看起来就像你的数据结构。可观察对象的实际值。导航所需的所有节点都是普通的javascript对象。

是的,您可以使用Knockouts Mapping功能并直接从模型对象创建ViewModels。但是,我有两点:

1)我认为对象存储在RavenDB中并不重要。您的MVC应用程序从RavenDB检索对象-因此它们从JSON中反序列化,然后通过REST接口提供给您的JS页面,因此它们再次序列化为JSON。因此,您不是直接使用RavenDB的JSON结构,它是序列化为JSON的标准CLR对象。

如果你想直接使用Raven,你必须将你的应用程序直接插入Raven的接口——这不是一个好主意(当然,从性能的角度来看,它应该工作得很好)。

2)我不认为使用你的模型对象作为ViewModels是一个好主意,只有通过使用击倒映射插件。

很快,您将需要向视图模型添加一些逻辑。用于计算要在视图中显示的值,或添加一些操作逻辑(保存/编辑…等)。

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

对于后者,无论如何您都必须用javascript编写视图模型。我建议直接用javascript编写视图模型。