2011-12-04 9 views
2

KnockoutJSが自分のアプリケーションで動作するかどうかを理解しようとしています。与えられたtopicについては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; 
} 

は、私は1つのまたは複数のqueryインスタンスを持って次のように(簡体字)私のデータモデルがあります。各クエリには、postingインスタンスのリストが含まれています。各postingはドキュメントを参照します。複数のpostingpostingインスタンスが別のqueryインスタンスに属している限り、与えられたdocumentを参照できます。

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

私は、サーバーから返されたJSONデータを構造化するためのいくつかの可能な選択肢を見ることができます:

  1. 投稿をシリアル化する場合、最初のすべての文書のリストをシリアル化し、それらをマスター文書のリストを更新。次に、文書IDへの参照を含む投稿を送信します。
  2. 各文書を投稿のプロパティとして完全にシリアライズし、そのエントリが重複しているかどうかを確認します。非冗長エントリをマスターリストに追加します。

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

おかげで、

遺伝子

+0

遺伝子、この質問はかなり広く主観的です。客観的に答えることができる具体的な質問が何であるかはわかりません。 –

+0

まあ、ベストプラクティスのイディオムに関するガイダンスを探していました。私はサーバーを制御できるので、戦略#1を実装しました。 –

答えて

1

を使用しています

A 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; 
    } 
} 

次のように私はこのコードを呼び出す:

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のをサポートしています。ノックアウト

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

+1

あなたはEntitySpacesを作成したと言ってもいいですか?もしそうなら、あなたがしたことを示してください(あなたの他の答えにもそうします)。この問題のFAQを読む:http://stackoverflow.com/faq#promotion – Bart

+0

申し訳ありませんが、私はそれを知らなかったし、リンクに感謝します。はい、私自身、DavidとScottはEntitySpacesのクリエイターです。 –

関連する問題