听一个商店活动

时间:2013-07-12 14:32:26

标签: ember.js

在我的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. 商店活动在哪里定义?我没有看到有关它的文档(this是我所知道的关于商店的唯一文档)
  3. 是否有更好的方法来删除所有记录,而不是在循环中删除每一条记录?

1 个答案:

答案 0 :(得分:1)

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

  

有这样的事件吗?

据我所知,商店里很难听到这样的事件。

  

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

由于ember-data尚未准备好生产,唯一真实的事实是源代码和内联注释。但通常在持续更改后端并根据您的设置所涉及的类,StoreRESTAdapterJSONSerializer,看看那里,您可以扩展所有这些让他们按你的意愿工作的课程。

  

是否有更好的方法来删除所有记录,而不是在循环中删除它们中的每一个?

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

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

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

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

如果您决定放弃使用ember数据,请首先查看discourse.orgrepo here的应用内部版本。它的构建没有余烬数据,可以作为一个看待事情如何完成的好地方。另外值得一提的是这个blog post详细介绍了discourse.org如何在没有余烬数据的情况下驱动它的网站。