5

私の Backbone.js ベースのアプリでは、まだデータが含まれていないコレクションが要求された場合に備えて、204 ステータスと空の本文で応答する API と通信しています。これは、RESTful API がそのような場合にどのように応答するべきかという私の意見です。

私のアプリでは、204 応答を受信した後に明らかにイベントがトリガーされないという問題があります。私はバインドしようとしましresetall

  FoosCollectionView.prototype.initialize = function() {
    this.collection = new FoosCollection;
    this.collection.bind('reset', this.render, this);
    this.collection.bind('all', this.render, this);
    return this.collection.fetch();
  };

しかし、イベントは発生しません。だから私はフェッチにいくつかのコールバックを与えようとしました:

  FoosCollectionView.prototype.initialize = function() {
    this.collection = new FoosCollection();
    return this.collection.fetch({
      success: function(a, b, c) {
        debugger;
      },
      error: function(a, b, c) {
        debugger;
      },
      complete: function(a, b) {
        debugger;
      }
    });
  };

同じ振る舞い。応答が 204 の場合、デバッグ ステートメントに到達することはありません。どうすれば 204 応答を処理できますか? そこに 204 の追加処理を掘り下げてsync追加する必要がありますか、それともバックボーンにまだわからないことがありますか?

Thxフェリックス

4

3 に答える 3

0

今日も同じ問題が発生しました。結論から言うと、私のコードは間違っていました。コードを変更した後success()、サーバーが で応答したときにコールバックが呼び出されました204 No Content

バックボーン: 1.2.3
jQuery: 2.1.4

不正なコード:

FooCollection = Backbone.Collection.extend({
  url: '/foo',

  model: FooModel,

  fetch: function (options) {

    // do something.

    // Actually, you should call `Backbone.Collection.prototype.fetch()`.
    return Backbone.Model.prototype.fetch.call(this, options);
  }
});

したがって、この問題が発生した場合は、コードにエラーがないかどうかを確認する必要があります。とにかくレスポンスを処理したい場合204 No Contentは、以下の方法があります。(非推奨)

  initialize: function() {
    this.collection = new FooCollection();

    var _this = this;
    this.collection.fetch({
      success: function (collection, response, options) {
      },
      error: function (collection, response, options) {
      }
    }).done(function (data, textStatus, jqXHR) {
      if (jqXHR.status === 204) {
        // do something.
        // e.g. _this.collection.reset();
      }
    });
  }
于 2016-01-08T15:45:39.767 に答える
0

解決策は、非常に前向きであると同時に扱いにくいように見えます。

parse渡された応答オブジェクトが空かどうかをチェックするように、コレクションでメソッドを定義するだけです。これは、204 が発生した場合のみです。次に、内部でイベントをトリガーするparse設定を行います。コレクション ビューはそのイベントにバインドされ、内部を参照できる関数を実行します。モデルが指定されていない場合は、標準テンプレートの代わりに「コンテンツなし」テンプレートをレンダリングできます。this.collection.models = []resetthis.collection.models

誰かがより良いアプローチを持っている場合は、ここに感謝します!

于 2012-11-12T11:32:26.673 に答える
0

Backbone.js は、そのような応答を空のコレクションにラップします。これを回避策として使用しています。

render: function(){
   if (this.collection.length == 0) {
       console.log('empty response');
       // initialize with default values
       this.collection.reset(data);
   }
   // do usual stuff
}
于 2015-04-22T20:37:17.660 に答える