8

こんにちはバックボーン忍者、

バックボーンを使うのはこれが初めてです。私の機能 (より大きなアプリの一部) では、バックボーン ビュー vA があり、モデル mA (あるべき姿) に支えられており、サーバー側は Spring MVC にあり、Spring コントローラー メソッドに @RequestBody と @ResponseBody のアノテーションが付けられています。Jackson は Spring で問題なく動作しています。

さて、アプリでは、

Backbone.Model
 |_ BaseModel (custom base model for our app)
   |_ mA (my model)

mA には独自のエンドポイントがあり、バックボーンは、PUT リクエストを作成するときにそれを正常に呼び出します。つまり、View vA から送信ボタン イベント ハンドラーから save() を呼び出すと、次のようになります。

this.model.save({

            success : function(){

                    alert('Request submitted successfully');


            },

            error : function(){
                alert('Something awful happened.');
            }

});

BaseModel には次のものがあります。

define([], function() {



window.BaseModel = Backbone.Model.extend({
 ......


});

onSyncError : function(model, response) {
        switch (response.status) {
        case 403:
        [...//some more code ]
        default:
            alert(bundle.getDefault('HTTP_RESP_OTH') + response.status);
        }
    },

    onSyncSuccess : function(model, response) {
        alert('Sync done! ');
    },

    sync : function(method, model, options) {
        options.error = this.onSyncError;
        Backbone.sync.call(this, method, model, options);
        ....//some more stuff.      
    },

}

スプリング コントローラの方法:

@RequestMapping(value="/resource/xyz/{id}.json", method = RequestMethod.PUT, consumes     = {"application/json"}
, produces = {"application/json"})
@ResponseBody
public Map<String,String> methodX(@RequestBody XyzDTO  xyzDTO){
....
map.put("msg", "success");

return map;
}

また、save 呼び出しを行う直前に、いくつかのモデル属性を変更します。これは、サーバー側の DTO の構造が次のように異なるためです。

this.model.unset("abc",{ silent: true });
this.model.set( { abc: {id : "2",xyz:{ ... //more code } ); 

問題は、save() を呼び出すと PUT 要求が生成され、Spring エンドポイント ハンドラーが正常に呼び出されることですが、応答コード 200 が返されます (これは私が期待することです)。ただし、Firebug で呼び出しをトレースすると、onSyncError メソッドに入ります。エラーメッセージが表示されます(「デフォルト」のケースのため)。

バックボーンのドキュメントには、「JSON 応答を返すときは、サーバーによって変更されたモデルの属性を送信し、クライアントで更新する必要があります」と記載されています。まあ、最後の画面の 1 つであるクライアント側のモデルを更新する必要はありません。ユーザーに成功/エラーを伝え、メイン ページ/ダッシュボードにリダイレクトするだけで済みます。

もう少し調べてみたところ、コード 200 のようです。応答が不十分なためです。同期が失敗する原因となる JSON 解析エラーが発生している可能性があります。

Firebug で応答を確認したところ、応答 JSON は {"msg":"Success"} のようになっています。

それで、何がうまくいかないのでしょうか?

4

4 に答える 4

9

Backbone.Model.save()サーバーからの応答は、モデルの値の更新されたハッシュであると予想されます。レスポンスが のようなもの{"msg":"Success"}である場合、Backbone はモデルとの同期に失敗する可能性があります。基本的に、HTTP 200 JSON 応答をモデルの属性として解釈し、それに応じてモデルを同期しようとします。

1) Spring コントローラー パスが JSON 化されたモデル レスポンスを返すようにする、2) レスポンス本文が空のプレーンな 200 を返す、または 3)フォーマットのレスポンスを探して異なるレスポンスを返すカスタムparseメソッドを作成する、のいずれかを試すことができます。{"msg":"Success"}

于 2013-06-06T19:50:10.443 に答える
1

御時間ありがとうございます。$.ajax を使用して PUT リクエストを作成し、バックボーン同期全体をバイパスすることで、最終的に問題を回避することができました。ajax コールバックの成功ハンドラーが応答を処理し、同期エラーはもうありません (とにかく呼び出されていないため) :)

于 2013-06-06T20:03:14.877 に答える
0

同じ問題に関する私の経験を共有します。カスタム基本モデルと呼び出し model.save および成功イベントは発生しません。

私の問題は、「this」を返さない基本モデルのカスタム セット関数にありました。

モデル保存のバックボーン ソース コードを覗いてみると、次のスニペットが見つかります。

  options.success = function(resp) {
    // Ensure attributes are restored during synchronous saves.
    model.attributes = attributes;
    var serverAttrs = model.parse(resp, options);
    if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs);
    if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) {
      return false;
    }
    if (success) success(model, resp, options);

    model.trigger('sync', model, resp, options);
  };

私の場合、 !model.set(serverAttrs, options) が失敗し、イベントをトリガーする前に save-function が false を返しました。

たぶんこれはあなたの問題ではありませんでしたが、うまくいけば他の誰かを助けるでしょう...

于 2013-10-23T14:25:05.993 に答える