backbone.js保存后不更新模型对象的id,为什么不呢?

Cjo*_*lly 9 backbone.js

我一直在尝试使用backbone.js,当我创建一个新的模型对象然后调用model.save()时,我一直受到阻碍.我期望使用来自数据库的id来更新模型对象的backbone.js默认行为,但事实并非如此.这不应该发生吗?我已经验证我收到了一个json格式属性的帖子.我的服务器将json保存到表中,然后将带有新id字段的json返回到backbone.js.它是否正确?我的服务器应该返回整个新对象还是只返回id或什么?

//contents of the POST from backbone.js
  { "text":"this is a test" }

//reply from my server
  { id:"15", text:"this is a test"  }
Run Code Online (Sandbox Code Playgroud)

我的示例代码如下

var SQLRow = Backbone.Model.extend({
 table:"",
 urlRoot:'db',
 url:function () {
    return "/" + this.urlRoot + "?table=" + this.table + 
                 "&id=" + this.attributes.id;
   }
});

var Xtra = SQLRow.extend ({
   table:'Xtra'
});

var row = new Xtra({
  text: "this is a test" 
});

alert(row.url());
row.save()
alert("row:" + row.get("id"));
Run Code Online (Sandbox Code Playgroud)

EBa*_*arr 6

很难从你的帖子中得知.两个想法:

1)来自服务器的响应不成功您的保存呼叫返回什么?

2)您的"id"属性被命名为ID之外的其他属性.要考虑不同的名称,请在模型中添加以下内容:

   idAttribute  : "MyModelsID",
Run Code Online (Sandbox Code Playgroud)

编辑

您可能面临计时问题,警报在ID返回之前触发.而不是你的最后两行试试这个:

row.save( null, 
              { 
                 success : function(model, response) { alert(model.get('id'); } 
               }
         );
Run Code Online (Sandbox Code Playgroud)

备选

正如@mu_is_too_short所提到的,另一种方法是甚至在模型上监听变化并响应事件.(我只是想尽可能地保持答案尽可能接近你的代码).但是像下面的伪代码应该让你开始......

var myView = Backbone.View.extend({
           ....
           initialize : function () {
                this.collection.bind('change',  this.SOME_LISTENING_FUNC    );

             }
  });
Run Code Online (Sandbox Code Playgroud)

或者,如果你在一个收藏/无视图的世界,像这样的东西创造了一个听众......

row.on('change',  function() {  /* do stuff */ }, this);               
Run Code Online (Sandbox Code Playgroud)

  • 代码存在两个问题.首先,服务器返回的json格式还需要引用属性的键(即.{id:"ax"}真的应该是{"id":"ax"}.在我做出改变后,我在做生意;但是,保存之后我的警报可能永远不会显示对象的真实性质,因为save是一个异步的ajax调用,我们总是在ajax和backbone.js处理完成之前得到警告.添加一个更改处理程序为**亩是短**以上建议是正确的方法: (3认同)