Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript knockoutjs的数据加载模式_Javascript_Knockout.js_Knockout Mapping Plugin - Fatal编程技术网

Javascript 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

我试图了解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;
}
    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的服务器,并且可以以任何有意义的方式构造它

    谢谢


    Gene

    Checkout 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,对吗?如果是的话,请说明你做了(其他答案也是如此)。请阅读关于这个问题的常见问题解答:对不起,我不知道,谢谢你的链接。是的,我自己,大卫和斯科特是实体空间的创造者。