更新Ember数据记录数组中的记录

时间:2016-09-14 21:09:24

标签: ember.js

我需要更新模型中的一些数据,在这种情况下恰好是来自控制器的DS.RecordArray。我的目的是避免在save()之后进行另一个API调用以获取更新的数组。我不确定访问RecordArray的特定元素并修改它们的最佳方法是什么。

在我将模型转换为常规Ember数组之前,我还不确定是否有更好的方法可以避免我收到的循环引用错误。这是代码:

        var subtypes = Ember.A();
            this.get('model').forEach(function(subtype){
            //converting the RecordArray to a regular array to 
            //avoid circular reference error
            subtypes.pushObject(subtype);
        });

        let task = this.store.createRecord('savetask', {
            id: 'savesubtypes',
            docketType: this.get('docket'),
            category: this.get('category'),
            docSubtypes: subtypes
        });
            task.save().then((result) => {
            //API returns task with modifications to
            //docSubtypes

            result.get('docSubtypes').forEach(function(subtype) {
                //need to modify the RecordArray with the changed values from 
                //the API. How to match these records with the ones on the model?
            }, this);

如果有任何不清楚的地方,请告诉我

1 个答案:

答案 0 :(得分:0)

我举一个完整的例子来揭示Ember数据的力量。

我们假设你有

/model/contact.js
import Ember from 'ember';
import DS from 'ember-data';

export default DS.Model.extend({
  notes: DS.hasMany(),
  date: DS.attr(),
  firstName: DS.attr(),
  lastName: DS.attr(),

});

并且您的笔记模型应为

/model/note.js
import DS from 'ember-data';

export default DS.Model.extend({
  contact: DS.belongsTo(),
  reference: DS.attr(),
  date: DS.attr(),
  content: DS.attr()
});

现在假设你想为这个联系人保存一个新的音符,所以它很容易而不是让它变得复杂:我假设你想在动作触发时这样做,所以我定义了一个像newNote这样的函数

/rounte for example you want to save this note in rounte/note.js / template/note.hbs
newNote: function(noteContent) {
      var newNoteData = {
        content: noteContent, // Pass the notecontent to the function
        contact: this.currentModel.get('contact'), //get your contact 

      };
      this.store.createRecord('note', newNoteData).save().then(() => {
          //do your notification or consolo.log('DONE');
      }, function() {
          // catch your error if any, alert('not saved !') 
      });
    }

你的模板就像

 <form class="form" {{action "newNote" noteContent on="submit" }}>
      {{textarea value=noteContent placeholder="Quick Note" class="form-control custom-control" rows="2"}}
         <button class="btn btn-success" type="submit">Save</button>
  </form>

就是这样。你基本上不需要任何其他东西,其余的将由Ember本身处理。如果您这样做,您会发现页面上的注释列表也会立即更新,并且请求也会发送到您的API。

我希望这个简单的代码可以为您提供更多洞察力,您可以根据此优化代码并获得最佳结果。