1

在我的App.NodesIndexController我正在做类似的事情:

destroyAllRecords: function () {
    var _this=this;
    Bootstrap.ModalPane.popup({
        heading: 'Warning',
        message: 'Are you sure you want to delete all nodes?',
        primary: 'Ok',
        secondary: 'Cancel',
        showBackdrop: true,
        callback: function(opts, event) {
            if (opts.primary) {
                _this.forEach(function(node) {
                    console.log('Deleting node %o', node);
                    node.deleteRecord();
                });
                var store = _this.get('store').commit();
                store.commit();
                store.on('didDelete', toggleMessageTray.bind(this, 'All nodes have been successfully deleted'));
            }
        }
    });
}

但我实际上不知道如何收听“商店已更新”事件。我不想收听单个nodes didDelete事件,而是收听在执行提交后触发的全局存储事件。

三个问题:

  1. 有这样的活动吗?
  2. 商店事件在哪里定义?我没有看到关于它的文档(是我知道的关于商店的唯一文档)
  3. 有没有比在循环中删除每个记录更好的方法来删除所有记录?
4

1 回答 1

1

首先是好问题!让我试着给你一个自以为是的答案。

有这样的活动吗?

据我所知,可悲的是,商店里没有这样的活动可以听。

商店事件在哪里定义?我没有看到有关它的文档(这是我知道的有关商店的唯一文档)

由于 ember-data 尚未准备好生产,唯一的真实情况是源代码和那里的内联注释。但通常当对后端进行持久更改时,根据您的设置,所涉及的类是 、StoreRESTAdapterJSONSerializer看看那里,您可以扩展所有这些类以使它们按您的意愿工作。

有没有比在循环中删除每个记录更好的方法来删除所有记录?

是和否,通过在您的适配器上定义bulkCommit只有true一次调用将使用所有记录的哈希值对后端进行一次调用,但在创建记录的情况下(感谢@MilkyWayJoe 纠正我,请参阅下面的评论),但这涉及显然,您的后端可以处理这个问题,如果这样做当然可以提高性能。

恕我直言,您最好通过扩展默认值RESTAdapter并编写您自己的适配器并挂钩到该方法didDeleteRecords中,因为当所有记录都被删除时,适配器会调用此方法。

所以,我希望我的回答能帮助你做出正确的选择——这意味着使用 ember-data 并编写你自己的适配器或使用普通的旧ajax调用来处理所有服务器的东西,也就是:

App.IndexRoute = Ember.Route.extend({
  model: function() {
    return $.getJSON(...);
  }
});

如果您决定放弃 ember-data,请先查看为discourse.org构建的应用程序,请点击此处。它是在没有 ember-data 的情况下构建的,可以作为一个了解事情如何完成的好地方。另外值得一提的是这篇博客文章,它详细介绍了 discourse.org 如何在没有 ember-data 的情况下驱动其网站。

于 2013-07-12T20:37:02.927 回答