在AJAX调用成功时创建模型实例

时间:2013-09-18 18:15:06

标签: javascript jquery ajax backbone.js

我有一个用户模型:

var UserModel = Backbone.Model.extend({
    defaults: {
        handle: '',
        email: '',
        uuid: '',
        userpic: '',
        tokenlogin: ''
    }
});

我还有一个名为UserSignIn的集合,虽然我不确定原因:

var UserSignIn = Backbone.Collection.extend({ model: UserModel });

在我的SignInView视图中,我有以下功能......

signIn: function(e) {
    e.preventDefault();

    this.collection.fetch({
        type: 'POST',
        url: 'http://localhost/app/api/User.php',
        dataType: "json",
        data: $.param({
            req: "REQUSERSIGNIN",
            platform: "WEB",
            useremail: $('#userSignIn #userEmail').val(),
            userpass: $('#userSignIn #userPassword').val()
        }),
        success: function(data) {

            // In here, I'd like to create an
            // instance of the model which I'd
            // like to pass around my app.

            var user = new UserModel({
                handle: data.HANDLE,
                email: data.EMAIL,
                uuid: data.UUIDUSER,
                userpic: data.USERPIC,
                tokenlogin: data.TOKENLOGIN
            });
        }
    });
}

正如您所看到的,我所要做的就是在BackBone.fetch()函数成功时创建一个User实例。

我想了解如何在我的应用程序周围传递这个新的“用户”UserModel()实例。当我尝试console.log(user)时,我得到了一个“ReferenceError:用户未定义”,显然我刚刚在fetch函数的成功回调中创建了它。

有人可以向我解释原因吗?

2 个答案:

答案 0 :(得分:1)

如果你想在骨干中遵循正确的方式,你必须将它插入你的收藏中。 我想你可以这样做:

在视图中初始化插入此内容:

initialize: function(){
   //..... your code in initialize
   this.userModel = null;
   this.collection = new UserCollection();
},


signIn: function(e) {
    e.preventDefault();
    var here = this;
    this.collection.fetch({
        type: 'POST',
        url: 'http://localhost/app/api/User.php',
        dataType: "json",
        data: $.param({
            req: "REQUSERSIGNIN",
            platform: "WEB",
            useremail: $('#userSignIn #userEmail').val(),
            userpass: $('#userSignIn #userPassword').val()
        }),
        success: function(data) {
             var user = {handle: data.HANDLE,email: data.EMAIL,uuid: data.UUIDUSER,userpic: data.USERPIC,tokenlogin: data.TOKENLOGIN};
            here.userModel = new UserModel(user);
            here.collection.addUser(here.userModel);
        }
    });
}

你的UserCollection必须是这样的:

var UserCollection = Backbone.Collection.extend({
    model: UserModel,
    initialize:function(){
        console.log('Initialized User collection');
    },
        addUser: function(users, options) {
            return this.add(users, options);
        }
});

要控制集合中的每个元素,您可以尝试此操作(如果您在成功函数中运行此代码,请使用here而不是this):

this.collection.each(function(user, index) {
    console.log(user);
    //if you want to set a value of your model:
    user.set('email', 'yournewemail@email.it');
    //if you want to get some value
    user.get('email');                          
});

答案 1 :(得分:0)

变量user的范围仅限于SignInView视图的success函数内,因此您无法console.log(user)user查找console.log(user)变量全球范围。您可以在success函数中创建用户后立即放置user以查看它是否已创建,因为这会找到局部变量var user;

要从应用中访问它,您还可以在获取功能之外声明fetch,然后只需在{{1}}功能中设置它。