2011-08-21 17 views
36

私は2つのモデルと1つのコレクションを持っています。 JobSummaryJobSummaryListJobSummaryアイテムのコレクションで、モデルであり、そして私はJobSummaryList含まJobSummarySnapshotモデルがあります:場合を除き...コレクションのあるbackbone.jsモデル

JobSummary = Backbone.Model.extend({}); 

JobSummaryList = Backbone.Collection.extend({ 
    model: JobSummary 
}); 

JobSummarySnapshot = Backbone.Model.extend({ 
    url: '/JobSummaryList', 

    defaults: { 
     pageNumber: 1, 
     summaryList: new JobSummaryList() 
    } 
}); 

私はJobSummarySnapshotオブジェクトにfetchを呼び出し、それを取得、すべてをI summaryListコレクションを移動すると、すべてobjectであり、JobSummaryではありません。

これはdefaultsオブジェクト以外では、summaryListJobSummaryListであることを知りません。私は各項目を調べてJobSummaryオブジェクトに変換することができますが、私はそれを手動で行う必要なしにそれを行う方法があることを望んでいました。

var returnData = { 
    pageNumber: 3, 
    summaryList: [ 
     { 
     id: 5, 
     name: 'name1'}, 
    { 
     id: 6, 
     name: 'name2'} 
    ] 
}; 

var fakeserver = sinon.fakeServer.create(); 
fakeserver.respondWith('GET', '/JobSummaryList', [200, 
{ 
    'Content-Type': 'application/json'}, 
           JSON.stringify(returnData)]); 

var callback = sinon.spy(); 


var summarySnapshot = new JobSummarySnapshot(); 
summarySnapshot.bind('change', callback); 

summarySnapshot.fetch(); 
fakeserver.respond(); 

var theReturnedList = callback.getCall(0).args[0].attributes.summaryList; 

_.each(theReturnedList, function(item) { 
    console.log('Original Item: '); 
    console.log(item instanceof JobSummary); // IS FALSE 
    var convertedItem = new JobSummary(item); 
    console.log('converted item: '); 
    console.log(convertedItem instanceof JobSummary); // IS TRUE 
}); 

UPDATE:

はここ(jsfiddle here作業)私のテストコードです 私がparse関数をオーバーライドし、そのように設定することができることを私に起こった...私は今、これを持っている:

JobSummarySnapshot = Backbone.Model.extend({ 
    url: '/JobSummaryList', 

    defaults: { 
     pageNumber: 1, 
     summaryList: new JobSummaryList() 
    }, 

    parse: function(response) { 
     this.set({pageNumber: response.pageNumber}); 

     var summaryList = new JobSummaryList(); 
     summaryList.add(response.summaryList); 

     this.set({summaryList: summaryList}); 
    } 
}); 

これまでのところ動作します。誰かがそれにコメントをしている場合に質問を残しておいてください....

答えて

55

parse()機能はset()であるべきではありません。属性を返すだけの方が良いでしょう、バックボーンはそれを設定します。例えばあなたはparse()から返すものは何でも

parse: function(response) { 
    response.summaryList = new JobSummaryList(response.summaryList); 
    return response; 
} 

passed to set()です。 (undefinedを返すようなものです)何も返さない

カスタムvalidate()/set()メソッドはオブジェクトを取得する予定であれば、それは、検証、または他のいくつかの予期しない結果を渡さない原因可能性がある、set(undefined)を呼び出すのと同じです。そのために検証またはset()メソッドが失敗した場合、Backbone.Model#fetch()に渡されたoptions.successコールバックは呼び出されません。また

、他の場所(だけではなく、サーバーの応答から)からプレーンオブジェクトにINGのset()もそれに影響を与える、あなたの代わりにset()を上書きする場合がありますように、これはより一般的にする:

set: function(attributes, options) { 
    if (attributes.summaryList !== undefined && !(attributes.summaryList instanceof JobSummaryList)) { 
     attributes.summaryList = new JobSummaryList(attributes.summaryList); 
    } 
    return Backbone.Model.prototype.set.call(this, attributes, options); 
} 

Backbone-relationalも興味深いかもしれません。モデル内にネストされたコレクション/モデルを扱う方がはるかに簡単です。私はセット()メソッドから復帰するのを忘れて

編集、コードは今

+0

に更新されますどうもありがとうございました。私は今日半分しか読んでいないという罪を犯しています。そしてもう一度、それは私を噛んでいます。上で述べたように、obseを解析関数から返すことは、ドキュメントではっきりと述べています....しかし、私は何とかそれを逃しました。再度、感謝します。 –

+1

LOVEの 'set'の例! – Bart

関連する問題