我试图了解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>
答案 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;
}
});