5

ヘッダーETagで動作するサーバーがあります。バックボーンは初めてAPIを参照します。すべてが良好で、応答を受信して​​解析します。2回目:バックボーンはサーバーにETagを送信し、応答としてNotModifiedを受信します。そして、Backboneがこの応答を解析しようとすると、resetというコレクションが生成されます。

コレクションをリセットする方法はありますか?

fetchメソッドに追加するオプションを追加する方法は機能しません。コレクションを完全に更新する必要があるので、サーバーの応答に到達した場合。

var recommendCollection = Backbone.Collection.extend({
    model : Event,
    etag : null,
    urlRoot : '/api/users',
    initialize: function() {
        this.etag = null;
    },
    parse: function(response) {
        return response.data;
    },      
    url : function () {
        return (this.urlRoot + "/"+window.me.get('id')+ "/recommendation");
    },
    beforeSend : function (jqXHR, settings) {
        jqXHR.setRequestHeader('if-none-match', this.etag);
    },
    complete : function (jqXHR, textStatus) {
        if (jqXHR.status == 200 || jqXHR.status == 304) {
            this.etag = jqXHR.getResponseHeader('ETag');
        }
    },
    update : function () {
        this.fetch({
            beforeSend : this.beforeSend.bind(this),
            complete : this.complete.bind(this),
            data : {
                cityId : window.me.get('cityId'),
            }
        });
    }
4

2 に答える 2

8

私の知る限り、304応答をトラップする簡単な解決策はありません。私が思いついたもの:

  • parseリクエストのステータスを確認し、必要に応じてコレクションに同じモデルを再入力するために使用できる2番目の引数を受け取ります。options動作しますが、トリガーされますreset

    parse: function(response, options) {
        if (options.xhr.status === 304)
            return this.models
    
        return response.data;
    }
    

    http://jsfiddle.net/nikoshr/sxv9P/12/

  • jQueryはifModifiedあなたを助けるかもしれないオプションを受け入れます

    ifModified デフォルト:false

    最後のリクエスト以降に応答が変更された場合にのみ、リクエストが成功することを許可します。これは、Last-Modifiedヘッダーをチェックすることによって行われます。デフォルト値はfalseで、ヘッダーは無視されます。jQuery 1.4では、この手法はサーバーによって指定された「etag」もチェックして、変更されていないデータをキャッチします。

  • fetchまたは、関数をオーバーライドして、304応答で停止します

    fetch: function(options) {
          options = options ? _.clone(options) : {};
          if (options.parse === undefined) options.parse = true;
          var collection = this;
          var success = options.success;
          options.success = function(resp, status, xhr) {
            if (xhr.status!==304)
                collection[options.add ? 'add' : 'reset'](collection.parse(resp, xhr), options);
            if (success) success(collection, resp);
          };
          options.error = Backbone.wrapError(options.error, collection, options);
          return (this.sync || Backbone.sync).call(this, 'read', this, options);
    }
    

    http://jsfiddle.net/sxv9P/1/

于 2012-06-20T08:44:52.117 に答える
1

304応答には、メッセージ本文を含めることはできません。申し訳ありませんが、答えるのが速すぎました。私の言葉はここでは役に立ちません。

于 2012-06-20T10:57:04.910 に答える