Backbone.js错误 - 未捕获TypeError:对象[object Object]没有方法'set'

时间:2012-06-26 12:42:53

标签: backbone.js

我的代码:

我是Backbone.js的新手,并尝试使用Backbone.js和PHP构建应用程序。当我试图在路由器中呼叫add时,我收到错误:

  

未捕获TypeError:对象[object Object]没有方法'set'。

请帮我找错。

感谢。

    // Models
    window.Users = Backbone.Model.extend({
        urlRoot:"./bb-api/users",
        defaults:{
            "id":null,
            "name":"",
            "email":"",
            "designation":""
        }
    });

    window.UsersCollection = Backbone.Collection.extend({
        model:Users,
        url:"./bb-api/users"
    });


    // Views


    window.AddUserView = Backbone.View.extend({

        template:_.template($('#new-user-tpl').html()),

        initialize:function(){
            this.model.bind("click", this.render, this);
        },

        render:function(){
            $(this.el).html(this.template(this.model.toJSON()));
            return this;
        },

        events:{
            "click .add":"saveUser"
        },

        saveUser:function(){ alert('saveUser');
            this.model.set({
                name:$("#name").val(),
                email:$("#email").val(),
                designation:$("#designation").val()
            });

            if(this.model.isNew()){
                this.model.create(this.model);
            }
            return false;
        }
    });


    // Router
    var AppRouter = Backbone.Router.extend({

        routes:{
            "":"welcome",
            "users":"list",
            "users/:id":"userDetails",
            "add":"addUser"
        },


        addUser:function(){ 
            this.addUserModel = new UsersCollection();
            this.addUserView = new AddUserView({model:this.addUserModel});
            $('#content').html(this.addUserView.render().el);
        }


    });

    var app = new AppRouter();
    Backbone.history.start();

2 个答案:

答案 0 :(得分:1)

正如评论中所建议的那样,问题从这里开始:

this.addUserModel = new UsersCollection();
this.addUserView = new AddUserView({model:this.addUserModel});

并在此完成:

saveUser:function(){ alert('saveUser');
    this.model.set({

通过传递集合代替模型,您会产生混淆,因此稍后在saveUser函数中尝试在Backbone.Model上调用set方法(Backbone.Collection) {1}}实例。


注意:从版本1.0.0开始,Backbone.Collection现在有一个set方法。在以前的版本中,例如问题作者使用的版本,该方法被称为update


您可以采取几个步骤来澄清此代码。对于初学者,我会重命名你的模型和集合类,以便很明显模型是单数形式,集合是复数形式:

window.Users => window.User

window.UsersCollection => window.Users

接下来,我会创建一个新的User模型,而不是Users集合,并将其传递给您的视图:

this.addUserModel = new User();
this.addUserView = new AddUserView({model:this.addUserModel});

最后,我会删除这些行:

if(this.model.isNew()){
    this.model.create(this.model);
}

首先,模型将始终是新的(因为您在传入之前创建了它),但更重要的是,您不需要调用Collection的{​​{1}}方法,因为当您已经创建了一个新模型时,该方法会创建一个新模型。也许您应该添加的是:

create

如果您的目的是将模型保存到服务器中。

由于您已经为模型指定了this.model.save(); ,因此应该只需要创建新模型,将其传递给视图,让视图根据DOM元素填充其属性,最后保存该模型的属性到您的服务器。

答案 1 :(得分:0)

我认为你面临着对象范围的问题。当事件触发时,它将事件对象发送到该函数。试试这个可行吧 使用initialize

中的当前视图声明全局变量
initialize : function(){ self = this; }

然后将其更改为self,

       saveUser:function(){ alert('saveUser');
        self.model.set({
            name:$("#name").val(),
            email:$("#email").val(),
            designation:$("#designation").val()
        });

        if(self.model.isNew()){
            self.model.create(this.model);
        }
        return false;
    }