0

我有一个用户模型:

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() 函数成功时创建一个用户实例。

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

有人可以向我解释为什么吗?

4

2 回答 2

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');                          
});
于 2013-09-18T18:24:53.040 回答
0

该变量user的范围仅在success您的 SignInView 视图的函数内,因此您不能从全局范围内console.log(user)查找user变量。您可以console.log(user)在函数中创建用户后success立即查看它是否已创建,因为这会找到局部变量user

要从应用程序访问它,您还可以var user;在 fetch 函数之外声明,然后在fetch函数中简单地设置它。

于 2013-09-18T18:24:44.097 回答