然后我尝试在一个按钮上绑定一个事件,该按钮应该从集合中删除一个元素,然后从DOM中删除.事情很好,点击触发了destroy方法,在集合上触发了remove事件,但是没有任何东西来自destroy的成功或错误回调
有人有线索吗?
该模型 :
define([ 'underscore','backbone' ],function(_,Backbone) { var memberModel = Backbone.Model.extend({ url: "/members.json",defaults: { email: "",firstname: "",lastname: "",gender: "",language: "",consent: false,guid: "",creationDate: "" },initialize: function(){ } }); return memberModel; });
风景 :
define([ 'jquery','underscore','backbone','mustache','collections/members','text!templates/members/page.html' ],function($,_,Backbone,Mustache,membersCollection,membersPageTemplate){ var membersPage = Backbone.View.extend({ el: '.page',initialize: function(){ this.members = new membersCollection(); this.members.on('remove',function(){ // works fine $('.members-body tr').first().remove(); console.log('removed from collection'); }); },render: function () { var that = this; this.members.fetch({success: function(){ var wrappedMembers = {"members" : that.members.toJSON()}; that.$el.html(Mustache.render(membersPageTemplate,wrappedMembers)); $('#delete-member').click(function(){ that.members.at(0).destroy({ // prints nothing!!! success: function(){ console.log('sucess'); },error: function(){ console.log('error'); } }); }); }}); } }); return membersPage; });
解决方法
您的Destroy()调用未返回有效的JSON.
>看着萤火虫,小提琴手,或其他什么,你的破坏()反应是什么样的?
>我也很好奇当你的删除点击功能被触发时是什么.
> destroy是否返回false或jqXHR对象?
骨干有点断开(至少我起初对我而言).在调用destroy()或fetch / save时,调用是异步的.通话结束后,立即触发删除事件,您的收藏可以响应.但是,在文档中深入挖掘,另一个事件被激活了删除的确认:
and a “sync” event,after the server has successfully acknowledged the model’s deletion
所以你的收藏是基于删除成功的假设.如果您希望收藏集响应已确认的删除,请查找同步事件.
这留下了一个唠叨点 – 为什么你的错误处理程序没有被解雇?好吧,回调旨在响应删除的确认.但我敢打赌,JS调用堆栈不知道如何解释它返回的响应,作为成功或错误.你可能偶然发现了AJAX的现实.我发现在backbone,jquery和其他一些框架中你可以混淆ajax错误处理.谷歌“jquery ajax错误未被调用”,你会发现许多不同的场景,其中没有触发错误事件.
UPDATE
来回评论后……发生了两件事.首先,您的模型被视为“新”,这意味着对Destroy()的调用不会产生服务器请求.因此,您的成功/错误不会触发.见this commit.
话虽如此,我认为你不认为你的模型是新的(没有持久到服务器).你需要做两件事之一.要么在模型映射中包含名为id OR的属性,请将模型ID(我假设为guid)添加到模型的ID中.通过将以下行应用于您的模型,可以轻松进行映射:idAttribute:“guid”.你可以在idAttribute here上看到更多.