1

コレクションに対して最初fetchに行われるのは、各モデルの部分的な詳細を取得することです。ユーザーがWebページ上のアイテムをクリックすると、そのアイテムの詳細を取得してユーザーに表示する必要があります。

そのアイテムの初期フェッチで欠落している追加データを返すAPI関数は、すでに実装されています(/api/full_details)。

問題:追加を取得して既存のモデルに追加するにはどうすればよいですか?私の理解では、を実行するmodel.fetch()と、そのモデルの既存のデータは失われます。forモデルにforコレクションのようなfetch()オプションがある場合、それが私がここで必要とするものになると思います。{add:true}fetch()

モデル

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

コレクション

ListingCollection = Backbone.Collection.extend({
    model: Listing,
    url: '/api/search'
});

意見

ListingListView = Backbone.View.extend({ ........ });

ListingView = Backbone.View.extend({
    events: {
        'click': 'getFullDetails'
    },

    getFullDetails: function() {
        // What should I do here?
    }
})

ルーターのどこか

this.listingList = new ListingCollection();
var self = this;
this.listingList.fetch({
    data: {some:data},
    processData: true,
    success: function() {   
        self.listingListView = new ListingListView({ collection: self.listingListNew });
        self.listingListView.render();
    }
4

1 に答える 1

2

私はおそらくこれのために2つの別々のモデルを使用するでしょう:

  1. 既存のモデルはになりListingSummary、コレクションにはListingSummaryインスタンスが含まれます。
  2. フルバージョンの新しいListing(またはListingFull)モデルを作成します。これはによって裏付けられ/api/full_detailsます。

サマリーモデルにすでにある情報を使用して、完全なモデルを初期化できます。

var ListingSummary = Backbone.Model.extend({
    //...
    getListing: function() {
        if(!this._full) {
            this._full = new Listing({ summary: this });
            this._full.fetch();
        }
        return this._full;
    }
});

その後、フルバージョンで終了します。

var Listing = Backbone.Model.extend({
    initialize: function() {
        if(this.options.summary) {
            // Copy the interesting bits from this.options.summary.attributes
            // to this.attributes, possibly using this.set()
        }
    }
});

次に、完全なリストビューで、完全にロードされてListingいるかどうかを確認できます。完全にロードされている場合、ビューには完全なリストが表示されますが、モデルがまだすべてになっていない場合、ビューにはそこにあるものが表示され、スピナー/ローダー/がスローされます。サーバーが完全なListingモデルで応答するのを待っている間、throbber/whatever-you-call-it 。あなたの見解は、いつものように、すべてがいつ準備ができたかを知るためにモデルからのイベントをリストします。

既存のモデルと同じことを行うことができます。別のモデルを使用する代わりにListing、生の呼び出しを実行するだけです。$.ajax

loadFullModel: function() {
    if(this._fullyLoaded)
        return;
    // Call out to /api/full_details ...
    var _this = this;
    $.ajax({
        //...
        success: function(data) {
            // Do things with data...
            _this._fully_loaded = true;
            // Trigger your event...
        }
    });
}
于 2012-10-03T03:07:35.843 に答える