我需要将defaultValue
的price属性设置为item的价格。我不想使用ComputedProperty,因为当我的商品价格发生变化时,我的transaction_detail的价格也会发生变化,我的情景第一次设置为price
值&不应该改变。
这是我的TransactionDetail.js。
var TransactionDetail = DS.Model.extend({
transaction: DS.belongsTo('transaction'),
item: DS.belongsTo('item', { async: true }),
borrowed_at: borrowedAt,
max_returned_at: maxReturnedAt,
returned_at: DS.attr('date'),
price: DS.attr('number', {
defaultValue: function( detail) {
return detail.get('item.price'); // EXPECT TO GET ITEM'S PRICE, BUT ACTUAL IS NULL
}
}),
});
以下是我的Item.js
var Item = DS.Model.extend({
name: DS.attr('string'),
is_available: DS.attr('boolean', { defaultValue: true }),
price: DS.attr('number', { defaultValue: 0 })
});
更新
在我阅读this后,我在initializers/reopen-store.js
上添加文件并编辑内容,如下所示:
import DS from 'ember-data';
export function initialize(container, application) {
var store = container.lookup('store:main');
store.reopen({
createRecord: function(type, properties) {
if (type === 'transactionDetail') {
if (typeof properties.price !== 'number') {
properties.price = properties.item.get('price');
}
}
return this._super.apply(this, arguments);
}.on('createRecord')
});
};
export default DS.Store.extend({
name: 'reopen-store',
initialize: initialize
});
但是当我在模型上debugger;
时,this.get('item.price')
仍为undefined
。有什么想法吗?
更新2:
感谢GJK的回复。但你的回答对我来说仍然没有运气。
这是我的app/store.js
:
import DS from 'ember-data';
export default DS.Store.extend({
init: function() {
console.log('Init called!');
return this._super.apply(this, arguments);
},
createRecord: function(type, properties) {
console.log('Prepare createRecord!');
debugger;
if (type === 'transactionDetail') {
if (typeof properties.price !== 'number') {
properties.price = properties.item.get('price');
}
}
return this._super.apply(this, arguments);
}
});
在我的控制台中,输出只是Init called!
。我的Chrome中未触发'Prepare createRecord!'
和debugger
。有什么想法吗?
答案 0 :(得分:0)
在defaultValue
函数中,item.price
即将出现null
,因为item
关系可能尚未初始化。就个人而言,我会在您创建记录时在商店中处理此问题,而不是在模型中。
App.Store = DS.Store.extend({
createRecord: function(type, properties) {
if (type === 'transactionDetail') {
if (typeof properties.price !== 'number') {
properties.price = properties.item.get('price');
}
}
return this._super.apply(this, arguments);
}
});
可能需要更多的错误检查,但你明白了。如果在创建时没有给出价格,请将其填入并让商店处理剩下的工作。