0

DOM とやり取りするために、 tastypieアダプターと jquery を備えたバックボーンを使用しています。バックボーンで理解できないものを見つけました。この質問のコードを単純化しようとしました。

ここに私のapp.jsがあります:

$(document).ready(function() {
    Point = Backbone.Model.extend({
        defaults:{
            lat:0,
            lng:0
        },
        urlRoot: '/api/v1/point' ,
        initialize: function(attributes){
            var that = this;
            $('#b1').bind('click',function() {
                that.set('lat',that.get('lat')+1);
            });
            $('#b2').bind('click',function() {
                that.save();
            });
            $('#b3').bind('click',function() {
                console.log(that.get('lat'));
            });
        }
    });

    point = new  Point ();

    //****

    $('#b1').click();
    $('#b2').click();
    $('#b3').click(); // >> 1

    $('#b1').click();
    $('#b2').click();
    $('#b3').click(); // >> 2

    //****
});

そして私のhtml:

<script src="/static/js/jquery.js"></script>
<script src="/static/js/backbone.js"></script>
<script src="/static/js/backbone-tastypie.js"></script>
<script src="/static/js/app.js"></script>

<button id="b1">b1</button>
<button id="b2">b2</button>
<button id="b3">b3</button> 

ご覧のとおり、コード内のボタンのクリックを呼び出しており、コンソールは期待どおりに「1」と「2」を記録しています。

この問題は、星 (// * ) の間のコードを削除し、これらのボタン 'b1'、'b2'、'b3'、'b1'、'b2'、'b3' をブラウザーで手動で押して、'1' を取得したときに発生します。およびコンソールで「1」。

サーバーからの応答を 1 秒間待ってコンソールで確認しますが、アプリの動作は同じです:「1」、「2」は星付きのコードで、「1」、「1」はボタンを押した状態です.

なぜなのかご存知ですか?

4

1 に答える 1

1

サーバーからの応答を 1 秒間待ち、コンソールで確認しますが [...]

ここでは、プログラム ( click()) ではなく手動でモデルを変更する (マウスを使用してボタンをクリックする) ことが重要です。

バックボーンがそのデータでモデルを更新するため、サーバーから最終モデルを返さないと思います。

セクション53および

if (options.wait) {
  if (attrs && !this._validate(attrs, options)) return false;
  current = _.clone(this.attributes);
}

セクション55

options.success = function(resp, status, xhr) {
  done = true;
  var serverAttrs = model.parse(resp);
  if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs);
  if (!model.set(serverAttrs, options)) return false;
  if (success) success(model, resp, options);
};

Backbone.js ドキュメントの. 特にこれらの行:

var serverAttrs = model.parse(resp);(応答からモデル データを解析)

if (!model.set(serverAttrs, options)) return false;(モデルの属性を更新します)

最初のコード (click()ボタンを配置するコード) が実行されると、モデル属性が増加し、サーバーが戻る前にログに記録されます。それは

注:最初のコードでボタン 3 を 2 回押してwaitオプションまたは aを使用すると、同じ動作になります。setTimeout()

ただし、必要なのは、サーバーから有効なモデルを返すことです(永続化した後)。

トピック外のヒント:initializeモデルとビューをモデルrでバインドしないでください。バインドすると、結合がconstructor強すぎて交換できなくなります。(この質問については、確かに受け入れられます。;)

于 2012-12-29T12:06:57.443 に答える