【问题标题】:How to remove duplicate records in ember-data during addObjects如何在 addObjects 期间删除 ember-data 中的重复记录
【发布时间】:2013-01-22 22:47:30
【问题描述】:

我正在处理一组可能具有重复值的数据。当我最初添加数据时,我使用的是客户端上可用的少量信息(存储在内存中模型上的静态信息)。

但是因为每次显示车把模板时我都需要获取最新的,所以我还在计算属性中触发了一个“findAll”,以获取自初始 ember 应用程序启动以来可能已经到达服务器端的任何新数据。

在此过程中,我在 ember-data 模型上使用“addObjects”方法,但是当返回服务器端时,我看到数组中有重复记录(假设是因为它们没有相同的 clientId)

App.Day = DS.Model.extend({
    appointments: function() {
        //this will hit a backend server so it's slow
        return App.Appointment.find();
    }.property(),
    slots: function() {
        //no need to hit a backend server here so it's fast
        return App.Slot.all();
    }.property(),
    combined: function() {
        var apts = this.get('apppointments'),
        slots = this.get('slots');
        for(var i = 0; i < slots.get('length'); i++) {
          var slot = slots.objectAt(i);
          var tempApt = App.Appointment.createRecord({start: slot.get('start'), end: slot.get('end')});
          apts.addObjects(tempApt);
        }            

        return apts;
    }.property()
});

是否可以告诉 ember-data 模型是什么让它独一无二,以便在解决承诺时它会知道“这已经存在于 AdapterPopulatedRecordArray 中,所以我将更新它的值而不是显示两次”

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    你可以使用

    DS.RESTAdapter.map('App.Slot', {
      primaryKey: 'name-of-attribute'
    });
    DS.RESTAdapter.map('App.Appointment', {
      primaryKey: 'name-of-attribute'
    });
    

    但我认为这仍然是不可能的,因为 App.SlotApp.Appointment 是不同的模型类,所以如果它们具有相同的 id 将无济于事。您需要对插槽和约会使用相同的模型才能使其正常工作。

    编辑

    在检查 ember-datathe source 之后,我认为您可以在定义类时定义 primaryKey,例如:

    App.Slot = DS.Model.extend({
        primaryKey: 'myId',
        otherField: DS.attr('number')
    });
    

    虽然我没有测试它..

    编辑 2

    further reading 之后似乎不再支持之前的编辑。正如我之前写的,您需要使用map

    【讨论】:

    • 我刚刚更新了上面的代码 - 我现在实际上为每个插槽创建了一个“空”约会(所以它只是 1 个模型)。这样,我要添加的约会只是某种占位符-如果该时间段在服务器端是空的(没有害处,它仍然是空的)..但是如果它已经在该位置(服务器端)有约会,我需要根据开始/结束值更新项目(这可能还是 primaryKey 想法是单个字段?)
    • 现在可以使用primaryKey映射来定义自定义id,但是从源码看好像是单个字段。我认为您需要编写自己的适配器,或者,也许,一个序列化程序(少工作)。
    • 您可以创建一个自定义字段,该字段以一一对应的方式组合开始/结束,并将该字段用作 id。 start-X-end 之类的东西可能会消失..
    • 如果我创建一个项目,其 PK 在 ajax 调用 ember-data 内部爆炸后可能存在(似乎它不喜欢这种方法 - 在 pk 已经在对象中之后加载记录图形)。你有没有运气这样做?
    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    相关资源
    最近更新 更多