Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 在主干中保存后丢失模型实例_Backbone.js_Tastypie - Fatal编程技术网

Backbone.js 在主干中保存后丢失模型实例

Backbone.js 在主干中保存后丢失模型实例,backbone.js,tastypie,Backbone.js,Tastypie,我正在使用adapter和jquery与DOM交互。我在主干中发现了一些我不明白的东西。我试图简化这个问题的代码 这是我的app.js: $(document).ready(function() { Point = Backbone.Model.extend({ defaults:{ lat:0, lng:0 }, urlRoot: '/api/v1/point' , init

我正在使用adapter和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> 

b1
b2
b3
如您所见,我正在调用代码中的按钮,控制台将按预期记录“1”和“2”

当我删除星号(//*)之间的代码并在浏览器中手动按下这些按钮“b1”、“b2”、“b3”、“b1”、“b2”、“b3”并在控制台中获得“1”和“1”时,就会出现问题

我等待服务器的响应1秒,并在控制台中检查它,但应用程序的行为仍然是一样的:“1”,“2”带有带星星的代码,“1”,“1”,按下按钮

你知道为什么吗

我等待服务器的响应1秒钟,并在控制台中检查它,但[…]

手动更改模型(使用鼠标单击按钮)而不是以编程方式(
click()
)是此处的关键部分

我假设您没有从服务器返回最终的模型,因为主干网更新是使用该数据的您的模型

看到和

是的。特别是以下几行:

var serverAttrs=model.parse(resp)(从响应解析模型数据)

如果(!model.set(serverAttrs,options))返回false(更新模型的属性)

当您的第一个代码(您单击按钮的代码)运行时,它会增加models属性并在服务器返回之前记录它。那是

注意:在第二次按下第一个代码中的按钮3时,使用
wait
选项或
setTimeout()
将等同于该行为

但您需要的是从服务器返回一个有效的模型(在持久化它之后)

非主题提示:您不应该在模型
初始化
r或
构造函数中绑定您的模型和视图,因为这样会使它们耦合得太紧,并且无法互换。(对于这个问题,这当然是可以接受的。)

if (options.wait) {
  if (attrs && !this._validate(attrs, options)) return false;
  current = _.clone(this.attributes);
}
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);
};