主干.js模型的销毁方法不会触发成功或错误事件



我开始学习Backbone.js我从这个样板开始,并通过从磁盘上的静态文件加载JSON数据并将其显示在html表中来举例。

然后

我尝试在一个按钮上绑定一个事件,该按钮应该从集合中删除一个元素,然后从 DOM 中删除。事情工作正常,单击触发destroy方法,在集合上触发remove事件,但没有任何结果来自successerror回调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((反应是什么样的?
  • 我也很好奇触发删除点击功能时that是什么。
  • 销毁返回的是假还是 jqXHR 对象?

骨干有点脱节(至少我一开始是这样(。 调用destroy()或获取/保存时,调用是异步的。 调用后,立即触发删除事件,集合可以响应。 但是,在文档中更深入地挖掘,触发了另一个事件,确认删除:

以及服务器成功确认模型删除后的"同步"事件

因此,您的集合正在假定删除已成功。 如果您希望集合响应已确认的删除,请查找sync事件。

这留下了一个烦恼点 - 为什么你的错误处理程序没有触发? 好吧,回调旨在响应删除的确认。但我敢打赌,JS调用堆栈不知道如何解释它返回的响应是成功还是错误。您可能偶然发现了 AJAX 的现实。 我在 backbone、jquery 和一堆其他框架中发现,您可能会混淆 ajax 错误处理。 谷歌"jquery ajax error未调用",你会发现许多不同的场景,错误事件没有被触发。


更新

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

话虽如此,我认为您不认为您的模型是新的(未持久保存到服务器(。 您需要做以下两件事之一。 要么包含一个名为 id 的属性,要么在模型中将模型 ID(我假设guid(映射到模型的 ID。 通过将以下行应用于模型,可以轻松映射:idAttribute: "guid" . 您可以在此处查看有关 idAttribute 的更多信息。

最新更新