Javascript knockoutjs的数据加载模式
我试图了解KnockoutJS是否适用于我的应用程序。我的数据模型(简化)如下:Javascript knockoutjs的数据加载模式,javascript,knockout.js,knockout-mapping-plugin,Javascript,Knockout.js,Knockout Mapping Plugin,我试图了解KnockoutJS是否适用于我的应用程序。我的数据模型(简化)如下: function topic(data) { this.id = data.id; this.queries = ko.observableArray([]); } function query(data) { this.id = data.id; this.text = data.text; this.searcher = data.searcherId; thi
function topic(data) {
this.id = data.id;
this.queries = ko.observableArray([]);
}
function query(data) {
this.id = data.id;
this.text = data.text;
this.searcher = data.searcherId;
this.postings = ko.observableArray([]);
}
function posting(data, query) {
this.documentId = data.docid;
this.rank = data.rank;
this.snippet = data.snippet;
this.score = data.score;
this.query = query;
this.document = null;
}
function document(data, topic) {
this.id = data.id;
this.url = data.url;
this.topic = topic;
}
var mapping = {
people: createMapping(Searcher),
topics: createMapping(Topic, this),
activeTopic: createReferenceMapping(function(){return self.topics();})
};
this.dataChannel.loadModel(function(data) {
ko.mapping.fromJS(data, mapping, this);
}
对于给定的主题
,我有一个或多个查询
实例。每个查询都包含一个过帐实例列表。每笔过账
均指一份文件。只要过帐
实例属于不同的查询
实例,就可以有多个过帐
引用给定的文档
如果发布
引用了一个新文档(任何查询
都没有检索到的文档),我想创建一个新实例;如果文档
已经存在(ID是唯一的),我想重新使用它
我可以看到一些构建服务器返回的JSON数据的可能替代方案:
序列化过帐时,首先序列化所有文档的列表,并使用它们更新主文档列表。然后,发送带有文档ID引用的帖子
将每个文档完全序列化为过帐的属性,然后确定该条目是否冗余。将非冗余条目添加到主列表中
什么是序列化数据的合理模式?是否有一些映射插件可以简洁地表达这一点?我可以控制生成JSON的服务器,并且可以以任何有意义的方式构造它
谢谢
GeneCheckout entityspaces.js,您可以观看一段视频,它支持完整的分层数据模型,甚至可以生成您的WCF JSON服务,它还支持REST API
使用敲除的Javascript ORM(数据访问)框架
以下是我为实现选项1所做的工作:
function idField(data) {
return ko.utils.unwrapObservable(data.id);
}
function createMapping(type, context) {
return {
key: idField,
create: constructor(type, context)
}
}
function constructor(type, context) {
return function(options) {
return new type(options.data, context);
}
}
function createReferenceMapping(collection) {
return {
key: idField,
create: lookup(collection)
}
}
function lookup(collectionOrClosure) {
return function(options) {
var collection = (typeof collectionOrClosure == 'function') ? collectionOrClosure() : collectionOrClosure;
var object = collection.findById(options.data.idref);
if (object == null)
console.log("Error: Could not find object with id " + options.data.idref + " in ", collection);
return object;
}
}
我将此代码称为:
function topic(data) {
this.id = data.id;
this.queries = ko.observableArray([]);
}
function query(data) {
this.id = data.id;
this.text = data.text;
this.searcher = data.searcherId;
this.postings = ko.observableArray([]);
}
function posting(data, query) {
this.documentId = data.docid;
this.rank = data.rank;
this.snippet = data.snippet;
this.score = data.score;
this.query = query;
this.document = null;
}
function document(data, topic) {
this.id = data.id;
this.url = data.url;
this.topic = topic;
}
var mapping = {
people: createMapping(Searcher),
topics: createMapping(Topic, this),
activeTopic: createReferenceMapping(function(){return self.topics();})
};
this.dataChannel.loadModel(function(data) {
ko.mapping.fromJS(data, mapping, this);
}
这涉及到创建新实例(通过构造函数
函数)和通过查找
查找现有实例,这个问题相当广泛和主观。我不清楚我们能客观地回答哪些具体问题。嗯,我在寻找关于习语和最佳实践的指导。我实施了策略#1,因为我控制了服务器。我说你创作了EntitySpace,对吗?如果是的话,请说明你做了(其他答案也是如此)。请阅读关于这个问题的常见问题解答:对不起,我不知道,谢谢你的链接。是的,我自己,大卫和斯科特是实体空间的创造者。