backbone.js fetch未更新模型

时间:2014-02-04 18:43:04

标签: api rest backbone.js fetch

我在这里阅读了其他帖子,看起来大部分时间都归结为获取异步。我不认为这是我的问题,因为1.我在fetch和2的成功回调中测试结果。我可以在js控制台中console.log(model.toJSON())以后它仍然没有更新

注意:我从API获得了一个很好的json响应,我可以通过在我的模型声明中添加'parse'来获取数据

parse: function(data){
    alert(data.screenname);
}

这是我的代码,为什么没有使用fetch调用更新模型

<html>
  <head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
    <script src="vendor/components/underscore/underscore-min.js"></script>
    <script src="vendor/components/backbone/backbone-min.js"></script>
  </head>
  <body>
    Hello
<script>
$.ajaxSetup({
  beforeSend: function(xhr){
    xhr.setRequestHeader("Authorization", "Basic " + window.btoa("username" + ":" + "password"));
  }
});

var User=Backbone.Model.extend({
  parse: function(data){
    alert(data.screenname);
  },
  urlRoot: 'http://api.myapi.com/user'
});

var user=new User({id:'1'});

user.fetch({
  success: function(collection, response, options){
    console.log(response);
    console.log(user.toJSON());
  }
});
</script>
</body>
</html>

当我记录响应时,它显示一个好的json回来,但user.toJSON只显示id为1。

我可以在模型声明中使用parse从响应中手动分配模型中的每个值,但这似乎是一种愚蠢的方法。我的印象是fetch()应该使用服务器的结果填充模型。

**修订* * 这是我从服务器返回的响应

{"id":1,"email":"test@email.com","password":"pass","screenname":"myname","id_zipcode":1,"id_city":1,"date_created":"2014-12-25 12:12:12"}

以下是我的api

的回复标题
HTTP/1.1 200 OK
Date: Tue, 04 Feb 2014 18:31:41 GMT
Server: Apache/2.2.24 (Unix) DAV/2 PHP/5.5.6 mod_ssl/2.2.24 OpenSSL/0.9.8y
X-Powered-By: PHP/5.5.6
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Authorization, Origin, X-Requested-With, Content-Type, Accept
Set-Cookie: PHPSESSID=pj1hm0c2ubgaerht3i5losga4; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 139
Keep-Alive: timeout=5, max=99
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8

1 个答案:

答案 0 :(得分:2)

您已覆盖了parse()方法,无法有效执行任何操作。它应该返回在模型上设置的所有属性;你没有返回任何东西,因此,没有在模型上设置任何东西。

应该是这样的。

var User=Backbone.Model.extend({
  parse: function(data){
    alert(data.screenname);
    return data; //all attributes in data will be set on the model
  },
  urlRoot: 'http://api.myapi.com/user'
});