Ember.js与Ember数据。模型对象_attributes在保存时不会持久保存到_data

时间:2015-12-03 16:02:52

标签: javascript ember.js ember-data

我试图了解ember-data模型如何将数据从_internalModel._attributes对象移动到_internalModel._data对象。

在我的情况下,我正在调用item.set('val', foo),其中'val'是我的item模型定义的属性,但是当我调用item.save() 'val'属性时与我调用item.set()之前的价值相同......

即使我正在动态创建合成属性,通常调用.set()然后.save()也能正常工作。任何人都可以解释为什么它不会将值保存到要保存的_data对象中吗?

来源

controller.js

...
actions: {
  saveItem(clickedItem) {
    const flashMessages = Ember.get(this, 'flashMessages');
    this.store.find('fid', this.get('device.selectedFid.fid_id')).then(response => {
      clickedItem.setProperties({
        foo: this.get('selectedAccount').get('group_id'),
        bar: response,
        baz: this.get('device.selectedFid.iccid'),
        fooBaz: this.get('selectedProduct.product_type_id'),
        val: (new Moment(clickedItem.get('newVal'))).format('YYYY-MM-DD HH:mm:ss')
      });

      clickedItem.save().then((result) => {
          flashMessages.success(result.get('item_name') + ' Successfully Saved!');
          this.incrementProperty('refreshCounter');
        }, (error) => {
          flashMessages.danger('ERROR: Saving Item: ' + error);
          this.incrementProperty('refreshCounter');
        }
      );

      this.set('editingItem', false);
    });
  }
}

model.js

import DS from 'ember-data';
import Ember from 'ember';
const computed = Ember.computed;
const attr = DS.attr;
const Model = DS.Model;

export default Model.extend({
  foo: attr('number'),
  bar: attr('string'),
  baz: attr('number'),
  val: attr('date')
});

template.hbs

<tbody>
    {{#each this as |item|}}
        <tr>
            <td>{{item.foo}}</td>
            <td>{{item.bar}}</td>
            <td>{{item.baz}}</td>
            <td>
                <button {{action 'edititem' item}}>Edit</button>
                <button {{action 'deleteitem' item}}>Delete</button>
            </td>
        </tr>
    {{/each}}
</tbody>

1 个答案:

答案 0 :(得分:0)

我明白了。

问题在于ember-data DS.attr('date')变换器。我不确定它为什么会失败并且没有错误被抛出。但是当我使用自定义转换器item.val被正确推送到我的API后端时。

以下是自定义转换器的代码:

import DS from 'ember-data';
import Moment from 'moment';

export default DS.Transform.extend({
  deserialize: function(value) {
    return new Moment.utc(value);
  },

  serialize: function(value) {
    return value && new Moment(value).isValid() ? value.toJSON() : null;
  }
});