fetch()方法发送默认值而不是新值

时间:2012-10-11 17:18:37

标签: backbone.js

我有一个模型的问题,我使用一些默认值进行实例化,我使用set()方法更改它,当我使用fetch()méthod时,我得到默认值值而不是新值,我试图在控制台中记录myModel.toJSON(),我看到新值,我启动myModel.fetch()我得到服务器端的默认值,疯了没有?

这是模型原型:

window.User = Backbone.Model.extend({
    defaults : {
        id : "1",
        username : "anonymous",
        facebook_id : "1235486421",
        facebook_token : "AEZH93FZFEFSFSFS4545154sfsfSF"
    },
    urlRoot: 'http:/localhost:3000/user',
    initialize : function() {
        console.log('User Constructor...');
        this.url = "http://localhost:3000/user/"+this.get('username')+'/'+this.get('facebook_id')+'/'+this.get('facebook_token');
    }
});

以下是我使用fetch()

的代码块
    fetch_user: function(){
    var CurrentUser = new User();
    FB.login(function(response) {
        if (response.authResponse) {
            var access_token = response.authResponse.accessToken;
            FB.api('/me', function(response) {
                console.log('Good to see you, ' + response.name + ', id: '+response.id+', token: '+access_token);
                CurrentUser.set('username', response.name);
                CurrentUser.set('facebook_id', response.id);
                CurrentUser.set('facebook_token', access_token);
                console.log('Current user is:  ' + CurrentUser.toJSON());
                CurrentUser.fetch({
                    success: function(_model){
                        console.log('User fetched successfully');
                    },
                    error: function(_model, error){
                        console.log('User fetched unsuccessfully');
                    }
                });
            });
        }
        else {
            console.log('User cancelled login or did not fully authorize.');
        }
    }, {scope: 'email'});
},

谢谢!

3 个答案:

答案 0 :(得分:1)

由于您的网址方案不是默认的“/ object / id”,因此您应该更新网址:

window.User = Backbone.Model.extend({
    defaults : {
        id : "1",
        username : "anonymous",
        facebook_id : "1235486421",
        facebook_token : "AEZH93FZFEFSFSFS4545154sfsfSF"
    }, events {
        "change" : "updateUrl"
    },
    initialize : function() {
        console.log('User Constructor...');
        this.updateUrl();
    },
    updateUrl : function() {
        this.url = "http://localhost:3000/user/" +
                   this.get('username') +
                   '/'+this.get('facebook_id') + 
                   '/'+this.get('facebook_token');
    }
});

答案 1 :(得分:0)

Backbone基于设置为模型的id属性的任何内容进行提取。实例化新用户时,默认情况下id设置为1。当你调用fetch时,Backbone会尝试根据urlRoot获取(因为它不是集合的一部分),而不是URL: HTTP:/本地主机:3000 /用户/ 1

http://backbonejs.org/#Model-url

http://backbonejs.org/#Model-urlRoot

如果您希望根据某些非id属性进行提取,则可能需要考虑重写Backbone的提取。

答案 2 :(得分:0)

我浪费了差不多一个小时的时间。您需要注意的是模型在获取成功方法之后得到更新,

 CurrentUser.fetch({
                success: function(_model){
                  console.log(_model);
 }