我试图了解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;
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;
}
对于给定的topic
,我有一个或多个query
个实例。每个查询都包含posting
个实例的列表。每个posting
都指一个文档。只要posting
个实例属于不同的document
个实例,就可以有多个posting
引用给定的query
。
如果posting
引用了一个新文档(尚未被任何query
检索到的文档),我想创建一个新实例;如果document
已经存在(ids是唯一的),我想重复使用它。
我可以看到一些可能的替代方法来构造服务器返回的JSON数据:
序列化数据的合理模式是什么?是否有一些映射插件魔术能够简洁地表达这一点?我可以控制生成JSON的服务器,并且可以以任何有意义的方式构造它。
谢谢,
基因
答案 0 :(得分:1)
以下是我为实施选项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;
}
}
我将此代码称为:
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);
}
这既需要创建新实例(通过constructor
功能),也可以通过lookup
查找现有实例。
答案 1 :(得分:0)
Checkout entityspaces.js,你可以观看一个视频,它支持完整的层次数据模型,甚至可以生成你的WCF JSON服务,它也支持REST API。
使用Knockout的Javascript ORM(数据访问)框架