我的代码:
我是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();
答案 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;
}