2011-12-04 19 views
2

我想了解KnockoutJS是否适用于我的应用程序。我的数据模型(简化的)是如下: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实例属于不同的query实例,多于一个posting可以指代给定的document

如果一个posting引用了一个新文档(其中一个还没有被任何query检索到),我想创建一个新实例;如果document已经存在(id是唯一的),我想重新使用它。

我可以看到一些可能的替代方案以构建由服务器返回的JSON数据:

  1. 当序列化的贴子,第一序列的所有文件的清单,并与他们更新主文档列表。然后,发送带有文档ID参考的帖子。
  2. 将每个文档完全序列化为发布的属性,然后确定该条目是否多余。将非冗余条目添加到主列表中。

什么是序列化数据的合理模式?有没有一些映射插件魔术可以简洁表达?我可以控制生成JSON的服务器,并且可以以任何有意义的方式构建它。

感谢,

基因

+0

基因,这个问题是相当宽泛和主观的。我不清楚我们可以客观回答哪些具体问题。 –

+0

那么,我一直在寻找最佳实践方面的成语指导。我实施了战略#1,因为我可以控制服务器。 –

回答

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查找现有的实例。

0

结帐entityspaces.js,有一个视频,你可以看,它完全支持hierarchcial数据模型,甚至会产生你的WCF JSON的服务,它支持REST API的为好。

一个JavaScript ORM(数据访问)的框架,采用淘汰赛

https://github.com/EntitySpaces/entityspaces.js#readme

+1

我是否说你创作了EntitySpaces?如果是这样,请指出你做了(并且为你的其他答案也这样做)。请阅读有关此问题的常见问题解答:http://stackoverflow.com/faq#promotion – Bart

+0

对不起,我不知道这一点,并感谢您的链接。是的,我自己,David和Scott是EntitySpaces的创造者。 –