灰烬 - 异步计算属性或观察者?

时间:2015-02-26 14:22:39

标签: ember.js ember-data promise

所以我是Ember的新手,并尝试找出设置依赖于相关模型数据的计算属性的最佳方法。我将在FYI以下的模型中加入。

我想将computed属性设置为异步结果(desiredOutcome)。 我的问题我是怎么做到的?或者使用观察者更合适,如question

score: function() {
    var self = this;
    var allscores = this.get('model.scores');

    //Find the scoreRecord that has the appropriate objective id (in this case just 1)
    var scoreRecord = allscores.find(function(item){
        var scoreID = item.get('id');

        return self.store.find('score', scoreID).then(function(scoreRecord){
            var objID = Number(scoreRecord.get('objective.id'));
            if (objID === 1){return true;}
        });
    });

    //Return the scoreRecord's score attribute
    var scoreID = scoreRecord.get('id');
    return this.store.find('score', scoreID).then(function(score){
        var desiredOutcome = score.get('score');
        console.log(desiredOutcome);
        return desiredOutcome;
    });
}.property('model.@each.scores', 'selectedObjective'),

对变量名称选择不当等道歉......

我的模特:

学生

scores:   DS.hasMany('score', {async: true}),  
name:     DS.attr('string')

目标

name:     DS.attr('string'),
scores:   DS.hasMany('score', {async : true})

评分

scoreResult:  DS.attr('number'),
objective:    DS.belongsTo('objective', {async: true}),
student:      DS.belongsTo('student', {async: true})

-------------的更新 ---------------

JSBin here。所以我喜欢的是返回其中一个分数,即在控制台中记录的1或2分,作为计算属性"得分"。但我假设我只是回到了一个未解决的承诺 - 没有经验的承诺 - 我如何适应以便它解决?

- 我也一直认为,对我采取不同的做法可能会更好。我可能会考虑使用适当的"得分"来创建一个具有模型的组件。如果有问题,我会更新一些细节。

2 个答案:

答案 0 :(得分:1)

当我今天在同样的事情上挣扎时,似乎答案是使用 DS.PromiseObject

首先,请将其包括在内:

import DS from 'ember-data';

然后你创建你的计算属性,如:

property: Ember.computed('id', function(){
    return DS.PromiseObject.create({
        promise: this.get('store').findRecord('account', this.get('id')).then((data) => {
            return 'Mr. ' + data.get('name');
        })
    });
})

最后在您的模板中,您可以使用内容访问结果(这是捕获):

{{property.content}}

这就是全部:)在这种特殊情况下,当您更改它将解析的ID并显示一个新名称时。

答案 1 :(得分:0)

像卡尔曼上面说的那样,你需要查看每个分数,这样你就需要改变你的属性参数

property('model.scores.@each', 'selectedObjective'),