【问题标题】:Ember.js Recommended Way to Remove Items From a Collection and Persist to RESTEmber.js 推荐的从集合中删除项目并保留到 REST 的方法
【发布时间】:2013-03-10 23:33:43
【问题描述】:

我遵循了有关 Ember.js 的 PeepCode 教程,并且正在扩展它以从选项卡中删除项目。我还在服务器上实现了一个简单的 RESTful 接口来持久化更改,并且正在使用 DS.RESTAdapter。

有2个相关模型:

  • 标签项
  • 选项卡,与 TabItem 具有 hasMany 关系

按照教程,我添加了一个简单的删除链接到选项卡模板:

<script type="text/x-handlebars" data-template-name="tab">
  <ul id="customer-tab">
    {{#each tabItem in tabItems}}
    <li>
      <h3><a href="#" {{ action "removeTabItem" tabItem }}>x</a> {{ tabItem.food.name }} <span>{{ money tabItem.cents}}</span></h3>
    </li>
    {{ else }}
      <li><h3>Click a food to add it</h3></li>
    {{/each}}
    <li id="total">
      <h3>Total <span>{{ money cents }}</span></h3></li>
    </li>
  </ul>
</script>

在控制器中

App.TabController = Ember.ObjectController.extend({
  removeTabItem: function(tabItem) {
    var store = this.get('store');
    store.transaction();
    var t = store.find(App.TabItem,tabItem.get('id'));
    t.deleteRecord();
    this.get('tabItems').removeObject(tabItem);
    store.commit();
  }
});

上面的控制器代码是我通过一些反复试验和猜测完成的。 “removeObject”调用似乎是从用户界面中正确删除项目所必需的,并且“deleteRecord”调用似乎是必要的,因此“commit”将导致对服务器的 DELETE 调用。

不过,控制器代码似乎有点冗长,我怀疑我遗漏了一些东西。有没有一种被认为更好的方法,可能更直接地使用“tabItem”,并且使用更少的 API 调用?

【问题讨论】:

    标签: javascript rest ember.js ember-data


    【解决方案1】:

    回答我自己的问题:

    • 行:

      var t = store.find(App.TabItem,tabItem.get('id'));
      

      只是没有必要,我可以使用传递给方法的 tabItem。所以我的 TabController 现在是:

      App.TabController = Ember.ObjectController.extend({
        removeTabItem: function(tabItem) {
          var store = this.get('store');
          store.transaction();
          tabItem.deleteRecord();
          store.commit();
        }
      });
      
    • Tab 模型与 TabItem 有“hasMany”关系,但没有自动关系返回,所以当 TabItem 更改(或被删除)时,我怀疑 Tab 不“知道”重绘TabItem 被删除后本身。向 TabItem 添加“belongsTo”关系似乎可以对此进行排序。

      App.TabItem = DS.Model.extend({
        tab: DS.belongsTo('App.Tab'),
        cents: DS.attr('number'),
        food: DS.belongsTo('App.Food')
      });
      

    【讨论】:

    • 我经历了类似的过程。我发现我还需要在夹具数据中为每个 tabItem 设置选项卡。我看到的问题是所有的 tabItems 都被删除了,而不仅仅是一个项目。你也看到了吗?
    • @JasonMoore 我已经检查过了,我从来不需要在 tabItems 的夹具数据中设置选项卡。此外,我在“一半”删除项目时遇到了问题,因为数据消失了,但列表项仍然存在,但我没有遇到所有被删除项目的问题。
    • 我在删除操作中添加了一个断点,通过检查tabItem.get('tab'),夹具数据没有定义选项卡,但动态创建的项目有。我想我知道你所说的“一半”移除物品是什么意思——物品被移除了,但价格仍然存在,对吧?我想知道是否存在某种订单问题,即在移除商品之前重新计算价格。单击另一个表然后返回表 4(带有夹具数据)时,我也收到错误消息:“无法调用未定义的方法 'hasOwnProperty'”。在表格之间移动时,您是否也看到了这一点?
    猜你喜欢
    • 1970-01-01
    • 2012-02-27
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多