2012-12-29 72 views
0

我使用backbonetastypie適配器和jquery與DOM交互。我發現了一些我無法理解的骨幹。我試圖簡化這個問題的代碼。保存骨幹後丟失模型實例

這裏是我的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'的代碼,按下按鈕。

你知道爲什麼嗎?

回答

1

我等待服務器響應1秒,在控制檯檢查,但[...]

手動更改模型(請使用鼠標單擊該按鈕),而不是編程方式(click() )是這裏的關鍵部分。

我假設您不會從服務器返回最終模型,因爲骨幹更新是您的模型與該數據。

section 53

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

section 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 documentation

。特別是這行:

​​(從響應解析模型數據)

if (!model.set(serverAttrs, options)) return false;(更新您的模型的屬性)

當你的第一個代碼(就是你click()的按鈕)運行時,它會增加你的模型屬性並在服務器返回之前記錄它。那

注:使用wait選項或按鈕,你的三個第二次按你的第一個代碼就等於行爲的setTimeout()

但是你想要的是從你的服務器返回一個有效的模型(在持久化之後)。

題外話提示:你應該不是你的模型和視圖,因爲這將他們夫婦太緊,他們不會互換綁定的模式initialize R或constructor。 (對於這個問題,這當然是可以接受的;)