我正在尝试使用Backbone和REST API:
这里是代码
我的模特:
var PagesModel = Backbone.Model.extend({
idAttribute: 'Guid',
initialize: function () {
this.on('remove', this.destroy);
},
urlRoot: '/api/pages'
});
收集:
var PagesCollection = Backbone.Collection.extend({
model: PagesModel,
url: '/api/pages'
});
查看:
var PagesView = Backbone.View.extend({
el: '#pages',
events: {
'click .removePage': 'remove',
},
initialize: function (collection) {
this.collection = collection;
this.collection.fetch();
this.template = $('#pages-template').html();
this.collection.bind('change reset', this.render, this);
},
render: function () {
var template = _.template(this.template);
$(this.el).html(template({ pages: this.collection.toJSON() }));
return this;
},
remove: function (e) {
e.preventDefault();
var id = $(e.currentTarget).closest('ul').data("id");
var item = this.collection.get(id);
this.collection.remove(item);
$(e.currentTarget).closest('ul').fadeOut(300, function () {
$(this).remove();
});
}
});
在这里,我正在启动应用程序:
$(function () {
var pagesCollection = new PagesCollection();
var pagesView = new PagesView(pagesCollection);
});
我点击或删除,在网络检查器中看到此链接
http://localhost:54286/backbone/function%20()%20%7B%20%20%20%20%20%20var%20base%20=%20getValue(this,%20'urlRoot')%20%7C%7C%20getValue(this.collection,%20'url')%20%7C%7C%20urlError();%20%20%20%20%20%20if%20(this.isNew())%20return%20base;%20%20%20%20%20%20return%20base%20+%20(base.charAt(base.length%20-%201)%20==%20'/'%20?%20''%20:%20'/')%20+%20encodeURIComponent(this.id);%20%20%20%20}
而不是/ api / pages / {guid}。
我做错了什么?
答案 0 :(得分:1)
我仍然没有完全理解为什么,但是你可以通过在>>删除之后摧毁你的模型来使其工作(Backbone在触发remove
事件后做了最后一件事:在模型中销毁集合的引用。)
但更好的是,直接在模型上使用destroy
函数,它会自动将其从集合中删除(如果需要,使用{wait: true}
)。
修改强>
最后设法找到问题的根源。事实上它很简单。要覆盖模型的url
(使用urlRoot
计算但无关紧要),您可以在调用Model#destroy
时传递url
Backbone.sync
选项(或其他内容)那就是它。)
现在你在想“但我没有!”。但你做了。监听器(在您的情况下为Model#destroy
)给出3个参数。 Model#destroy
会将第一个(模型本身)视为options
这就是失败(我认为Backbone需要一个补丁):给url
Backbone.sync
选项是_.result
唯一不用于计算网址的时间this.on('remove', this.destroy.bind(this, {}));
。因此,您会发现自己拥有模型的url属性,这是您在通话中看到的功能。
现在,对于quickfix:
Model#destroy
这将确保{}
来电的第一个参数为Collection#remove
(以及绑定上下文)。
忍受我一点时间。
现在,如果您仍然愿意在破坏模型之前致电remove
,那么这里有点破解:因为(如上所述)urlRoot
事件是触发之前 Backbone确保在模型中删除集合的引用,您不需要模型中的{{1}}属性。实际上,该模型将不再出现在该集合中,但Backbone仍会将该集合的URL考虑在内以获取该模型的URL(因为该引用仍在那里)。
答案 1 :(得分:0)
不是一个明确的答案,只是按照问题和backbone.js documentation中的代码进行操作,问题可能是您将方法命名为remove
,这会妨碍remove
1 {} Backbone.View
中的方法。
http://backbonejs.org/#View-remove
<强>更新强>:
您在网络检查器中看到的输出看起来就像是附加了Backbone.Model.url
函数的定义。意味着url
没有被正确调用(调用者可能缺少()
?)。你是否在申请表的任何地方覆盖Backbone.sync
?