2

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の に対して、1 つ以上のqueryインスタンスがあります。各クエリには、postingインスタンスのリストが含まれています。それぞれpostingがドキュメントを参照します。インスタンスが異なるインスタンスに属している限り、複数のインスタンスpostingを参照できます。documentpostingquery

postinga が新しいドキュメント (まだ取得されていないドキュメント) を参照する場合query、新しいインスタンスを作成したいと思います。がdocument既に存在する場合 (ID が一意)、再利用したいと思います。

サーバーから返される JSON データを構造化するためのいくつかの可能な代替手段を確認できます。

  1. 転記をシリアル化するときは、最初にすべてのドキュメントのリストをシリアル化し、それらでマスター ドキュメント リストを更新します。次に、ドキュメント ID への参照を含む投稿を送信します。
  2. 各ドキュメントを投稿のプロパティとして完全にシリアル化し、そのエントリが冗長かどうかを調べます。マスター リストに冗長でないエントリを追加します。

データをシリアル化するための合理的なパターンは何ですか? これを簡潔に表現するマッピング プラグイン マジックはありますか? 私は、JSON を生成しているサーバーを制御しており、それを理にかなった方法で構造化することができます。

ありがとう、

遺伝子

4

2 に答える 2

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ます。

于 2012-01-19T20:08:16.747 に答える
0

entityspaces.js を確認してください。ビデオを見ることができます。完全な階層データ モデルをサポートし、WCF JSON サービスを生成することもできます。REST API もサポートしています。

Knockout を使用する Javascript ORM (Data Access) フレームワーク

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

于 2012-01-19T04:39:11.693 に答える