我不了解Backbone的一个方面是它如何知道数据库中的哪些对象要同步。我在后端使用MongoDB - 如何告诉Backbone生成MongoDB样式的ObjectID以存储在DB中(也许Backbone只从Mongo获取ID - 但如果不是,我如何保证这个Backbone生成的ID与MongoDB生成ObjectIDs?)我遇到的主要问题是没有Backbone.Model id附加到我在PUT或DELETE调用模型中定义的根URL的末尾。
这是我的模特:
var team = document.getElementsByName('team');
console.log(team);
var Player = Backbone.Model.extend({
defaults: {
ID: "",
team: team,
firstName: '',
lastName: '',
age: '',
phone: '',
email: ''
},
idAttribute: "ID",
urlRoot: 'http://localhost:3000/api/players'
});
var PlayerCollection = Backbone.Collection.extend({
model: Player
});
这是视图:
var addPlayerView = Backbone.View.extend({
tagName: "div",
id: 'addPlayerDiv',
events: {
'click #submitNewPlayer': 'onAddPlayer',
'click #cancelNewPlayer': 'cancelAddPlayer'
},
initialize: function () {
},
render: function () {
var playerTemplate = document.getElementById('add-player-template').innerHTML;
this.$el.html(_.template(playerTemplate)());
return this;
},
onAddPlayer: function (event) {
event.preventDefault();
var data = form2js('add-player-template-form','.',true);
this.model.set({id:data.age,age:data.age,phone:data.phone,email:data.email});
this.model.save();
$(this.el).removeData();
this.unbind();
this.remove();
window.mainManageRosterView.render();
}
});
这里是我使用新模型实例初始化新视图的地方:
<script>
function addNewPlayer(event) {
event.preventDefault();
var player = new Player({}); //perhaps this is incorrect, the id is null/undefined after all
var newPlayerView = new addPlayerView({el: $("#addPlayerDiv"), model: player});
var rendered = newPlayerView.render();
$(rendered.el).appendTo(this.$el).hide().fadeIn().slideDown();
};
</script>
当然我做错了什么。该模型在视图中绝对不是未定义的,但它没有ID。如何为我的Backbone模型提供ID?也许Backbone只在保存后才给模型一个id?
重申一下,我遇到的主要问题是Backbone不会自动将ID附加到我在模型中定义的根URL的末尾:
PUT /api/players/ 404 319ms - 475b
但它看起来应该是这样的:
PUT /api/players/[mongoDB ObjectID here] 200 319ms - 475b
所以基本上,ID丢失了,我不知道为什么。此外,为什么Backbone在做PUT呢?如果它是第一次保存此模型,那么它不应该是POST吗?
答案 0 :(得分:1)
是否有可能,ID
未定义,因为您只是定义了id
?
您正在使用this.model.set({id:data.age, ...
(小写)来定义您的标识符
但是将idAttribute: "ID",
(大写)定义为ID属性。