Backbone.js模型的destroy方法无法触发成功或失败事件。

7
我正在学习Backbone.js,我使用了这个样板(链接)并且用从静态文件中加载的JSON数据在html表格中展示了一个例子。
然后我尝试在应该从集合中删除元素后再从DOM中删除绑定一个按钮事件。事情进行得很好,点击触发了destroy方法,remove事件也被触发了,但是在destroysuccess回调中没有输出任何内容。
有人有什么想法吗?
模型如下:
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;
});

你的模型或集合是否设置了 url - mu is too short
是的,url 在模型和集合上都设置了。 - MaxiWheat
1个回答

7

我同意这很奇怪。我还不确定正在发生什么,但以下是我的猜测...

你的Destroy()调用没有返回有效的JSON。

  • 观察firebug、fiddler或其他工具,你的destroy()响应看起来是什么样子的?
  • 当delete-click函数被触发时,我也很好奇that是什么。
  • destroy返回false还是jqXHR对象?

在backbone中有一些不协调(至少对我而言是如此)。当调用destroy()或fetch/save时,调用是异步的。在调用之后立即触发删除事件,你的集合可以做出响应。但是,在文档中深入挖掘后,另一个事件会在确认删除后触发:

并且在服务器成功确认模型已删除后,“同步”事件之后

因此,你的集合是基于删除已成功的假设而行动的。如果你希望你的集合响应已确认的删除,请查找sync事件。

这留下了一个令人恼火的问题——为什么你的错误处理程序没有触发?回调函数设计为响应删除的确认。但是我敢打赌JS调用堆栈不知道如何解释它收到的响应,是成功还是错误。你可能会遇到AJAX的现实情况。我在backbone、jquery和其他一些框架中发现,你可以混淆ajax错误处理。谷歌“jquery ajax error not called”,你会发现许多不同的情况下错误事件没有被触发。


更新

经过来回评论后,有两件事正在发生。首先,你的模型被视为“新”模型,这意味着对Destroy()的调用不会发出服务器请求。因此,你的成功/错误不会被触发。请参见此提交

话虽如此,我认为你不认为你的模型是新的(未持久化到服务器)。你需要做两件事中的一件。要么包括一个名为id的属性,要么在你的模型映射中将你的模型ID(我假设是guid)映射到模型的ID上。映射很容易,只需将以下行应用于你的模型:idAttribute: "guid"。你可以在这里了解更多信息。


我正在使用Google Chrome进行测试,当我查看“网络”选项卡时,调用destroy时没有任何反应。我还尝试使用Fiddler检查是否发送了DELETE http请求,但那里也没有任何动静。 - MaxiWheat
请在原始帖子中添加您的模型定义(包括来自fetch的JSON响应)。此外,在删除之前,that.members.at(0).IsNew的值是多少? - EBarr
我添加了我的模型,that.members.at(0).IsNewdestroy调用之前是undefined。我还在new membersCollection后面添加了括号。 - MaxiWheat
@EBarr "你的destroy()响应是什么样子的" 响应应该是什么样子的?我遇到了同样的问题,删除确实调用了服务器,但没有触发任何事件。我从服务器返回一个带有ok状态的空响应。 - Usman Ismail
1
@UsmanIsmail - 你只需要返回一个HTTP 200。听起来你的请求可能出错了,但如果没有代码示例/设置,很难确定。 - EBarr
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接