由模型生成的计数(通过数据透视表)未显示

时间:2016-01-13 10:21:27

标签: ember.js

我想知道参与扫描的人数。 此刻我需要2个计数:

  • 参与者总数
  • 总结算次数

我在Ember制作了一个数据透视表,其中包含有关参与者的特定数据,就像他完成扫描一样。

我的模特:

import DS from 'ember-data';

var inflector = Ember.Inflector.inflector;
inflector.irregular('scan', 'scan');

var scanModel = DS.Model.extend({
    title:               DS.attr('string'),
    mailInviteSubject:   DS.attr('string'),
    mailInviteMessage:   DS.attr('string'),
    mailResponseAddress: DS.attr('string'),
    dateDeadline:        DS.attr('date'),
    scanGroup:           DS.belongsTo('scanGroup',      {async: true}),
    questionGroups:      DS.hasMany('question-group',   {async: true}),


    /**
     * Participants
     */
    scanParticipants:            DS.hasMany('scanParticipants', {async: true}),
    participants:                Ember.computed('scanParticipants.@each.participants', function () {
        return this.get('scanParticipants').then(function(scanParticipants) {
            return scanParticipants.mapBy('participant');
        })
    }),
    participantsCount:           Ember.computed('scanParticipants', function () {
        return this.get('scanParticipants').then(function (participants) {
            return participants.get('length');
        });
    }),
    participantsCountFinished:   Ember.computed('scanParticipants', function () {
        return this.get('scanParticipants').then(function (participants) {
            return participants.filterBy('finished', true).get('length');
        });
    }),

    isClosed:        Ember.computed('dateDeadline', function () {
        let scanDate = moment(this.get('dateDeadline'));
        let date     = moment();

        if(scanDate < date)
            return true;
        else
            return false;
    }),
});

export default scanModel;

我有以下模板:

<td>{{input type="checkbox" checked=isChecked action="scanChecked"}}</td>
<td>
    <h2>{{scan.title}}</h2>
    Verloopt op {{format-date scan.dateDeadline format="DD MMMM"}} <small class="_muted">({{#if scan.isClosed}}Afgerond{{else}}Over{{/if}} {{format-date scan.dateDeadline type='remaining'}} geleden)</small>
</td>
<td>
    <h2>{{scan.participantsCount}}</h2>
    <small class="_muted">uitgenodigd</small>
</td>
<td>
    <h2>{{scan.participantsCountFinished}}</h2>
    <small class="_muted">voltooid</small>
</td>
<td class="_align-right">
    {{#link-to 'scangroup.scan' scan.id class="btn btn-inverted btn-small"}}Bekijk{{/link-to}}
</td>

现在的问题是,{{scan.participantsCount}}{{scan.participantsCountFinished}}在我的模板中显示[Object Object]而不是计数。

但是,如果我记录了诺言中的计数,我会得到应该在模板中显示的好计数。

如何显示[对象对象]而不是计数,我怎样才能显示计数?

提前致谢!

请问,

帕斯卡

1 个答案:

答案 0 :(得分:0)

您正在观察属性本身而不是数组。这意味着他们只会在scanParticipants更改值时重新计算,例如this.set('scanParticipants', someValue),而不是在更新时。要解决此问题,您可以执行Ember.computed('scanParticipants.[]', function() {

您看到的是[Object Object],因为这是从计算属性返回的承诺。当你从计算属性返回一个promise时,你需要将它包装在PromiseObject或PromiseArray中,但是Ember Data已经为你做了这个关系。 有几种方法可以解决这个问题:

  • 您可以在模板中使用{{scan.scanParticipants.length}}
  • 您可以声明participantsCount: Ember.computed.alias('scanParticipants.length')
  • 您可以participantsCount: Ember.computed('scanParticipants.[]', function () { return this.get('scanParticipants.length'); })

请注意,您还拥有Ember.computed.filterBy方法。