如何提取“ComputedProperty”到它的真正价值?

时间:2016-02-28 06:22:54

标签: ember.js ember-data

我正在尝试将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需要使用的对象仍然不是原始数据。有没有办法将数据提取为数字而不是PromiseComputedProperty

谢谢!

修改 - 按要求添加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')

});

2 个答案:

答案 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'),
        }
    });