【问题标题】:remove child from hasMany relationship从 hasMany 关系中删除孩子
【发布时间】:2012-10-05 00:41:48
【问题描述】:

如何在不删除孩子的情况下从 hasMany 关系中移除孩子?

我尝试将孩子的 foreign_key 设置为 null。我也尝试过在父关系上使用 removeObject。

这是一个例子。

App.Invoice = DS.Model.extend
  lines: DS.hasMany('App.Line')

App.Line = DS.Model.extend
  invoice: DS.belongsTo('App.Invoice')

App.InvoiceController = Ember.Controller.extend
  removeLine: (line) ->
    @get('content.lines').removeObject(line)
    line.set('invoice', null)
    @get('store').commit()

App.InvoiceEditView = Ember.View.extend
  templateName: 'invoice'

App.LineView = Ember.View.extend
  tagName: 'tr'
  templateName: 'line'


#invoice template
<table>
    {{#each content.tasks}}
      {{view App.LineView}}
    {{/each}}
</table>

#line template
<td><a {{action "removeLine" view.context}}>remove</a></td>
<td>{{description}}</td>
<td>{{price}}</td>
<td>{{price}}</td>

我正在使用

jquery 1.8.2
ember.js v1.0.pre-4
ember-data v11

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    在remove()函数中,它是commit(),然后再次调用remove()。这将导致“setProperty in state rootState.loaded.updated.inFlight”错误,因为在 Ajax 请求 inflight 时无法更改记录。

    如果您的意图是实际删除 Line,从而将其从 hasMany 关联中删除,那么我建议使用 remove() 函数,例如:

    remove: function(event) {
      var item = event.context;
      if (item.get('isDeleted')) return;
      item.deleteRecord();
      App.store.commit();
      return item;
    }
    

    请注意,一旦 deleteRecord() 将某些内容标记为删除,它将在 Ember 中保持有效,isDeleted == true 直到 commit() 成功完成。一旦标记为删除,您可能需要添加 classNames 绑定以使用 CSS 隐藏它:

    #line template
    <tr {{bindAttr class="isDeleted"}}>
      <td><a {{action "removeLine" target="view"}}>remove</a></td>
      <td>{{description}}</td>
      <td>{{price}}</td>
      <td>{{price}}</td>
    </tr>
    

    使用 CSS 类似:

    .is-deleted { display: none; }
    

    【讨论】:

    • 火星感谢您的回复。我有一个错字,remove() 函数应该是 removeLine(),然后调用从 Ember.View 继承的 remove() 并从 DOM 中删除元素。我在解释我的问题时搞砸了。但问题还是一样。我需要从发票中删除该行而不删除该行。我认为从子项中删除 foreign_key 或在集合上使用 removeObject 函数很容易,但我得到了那个错误,它不会在 commit() 上将更改发送到服务器。
    【解决方案2】:

    似乎将发票设置为空字符串有效。

     App.InvoiceController = Ember.Controller.extend
       removeLine: (line) ->
         @get('content.lines').removeObject(line)
         line.set('invoice', '')
         @get('store').commit()
    

    【讨论】:

    • removeObject 帮我从 hasMany 关系中删除了一个条目
    猜你喜欢
    • 2015-05-05
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2022-08-13
    • 2017-06-23
    • 2015-11-03
    相关资源
    最近更新 更多