我正在尝试将amCharts实现到一个项目中,看起来当我将EmberData模型作为dataProvider传递给它时,它无法理解这些承诺。
我试图通过在我的控制器中创建一个类似于:
的计算属性来解决这个问题路线:
--route.js
import Ember from 'ember';
const {Route, RSVP} = Ember;
export default Route.extend({
queryParams: {
start: {refreshModel: true},
stop: {refreshModel: true}
},
model(params) {
let filter = {
filter: {
start: params.start,
stop: params.stop
}
};
return RSVP.hash({
users: this.store.query('userActivity', filter, {async: false}),
});
},
setupController(controller, model) {
controller.set('model', model);
controller.set('users', model.users);
},
});
控制器(我已经剥离了其他部分,但它们不相关,足以说它们只是更改了触发模型刷新路径的查询参数):
--controller.js
import Ember from 'ember';
const {Controller, computed, get, set} = Ember;
export default Controller.extend({
queryParams: [ 'start', 'stop' ],
dataProvider: computed('users', function () {
let users = get(this, 'users')
.map(function (user) {
return {
calls_out: user.calls_out,
calls_in: user.calls_in,
}
});
console.log(users);
return users;
}),
});
但是,当我记录下来时,我得到以下内容:
0: Object +
calls_in: ComputedProperty
calls_out: ComputedProperty
__proto__: Object
1: Object
2: Object
这意味着amCharts需要使用的对象仍然不是原始数据。有没有办法将数据提取为数字而不是Promise
或ComputedProperty
?
谢谢!
修改 - 按要求添加userActivity
模型:
import DS from 'ember-data';
import Ember from 'ember';
export default DS.Model.extend({
// Attributes
title: DS.attr('string'),
first_name: DS.attr('string'),
last_name: DS.attr('string'),
calls_in: DS.attr('number'),
calls_out: DS.attr('number'),
// Computed Attributes
full_name: Ember.computed('first_name', 'last_name', function () {
return `${this.get('first_name')} ${this.get('last_name')}`;
}),
// Relationships
user: DS.belongsTo('user')
});
答案 0 :(得分:1)
DS.Model
上的每个属性都使用DS.attr()
定义,并且是计算属性。这是必需的,以便ember-data可以跟踪更改和回滚或更新属性。
对于您的用例,最好使用getProperties
:
const {computed,get,getProperties} = Ember;
...
dataProvider: computed('users.@each.calls_out', 'users.@each.calls_in', function () {
return get(this, 'users').map(u => getProperties(u, 'calls_out', 'calls_in'));
})
然后get(this,'dataProvider')将为您提供一个原始Javascript数组,其原始Javascript对象包含原始字符串(或数字,具体取决于您的DS.attr
)。
答案 1 :(得分:0)
“用户”课程中有什么内容?他们是Ember的对象吗?您可以提供更多代码。
如果“calls_in”和“calls_out”是此用户类的计算属性,则应该像这样调用它们:
let users = get(this, 'users')
.map(function (user) {
return {
calls_out: user.get('calls_out'),
calls_in: user.get('calls_in'),
}
});