访问控制器中相关模型的属性

时间:2015-02-21 00:32:59

标签: ember.js ember-data

我一直在询问一些questions围绕同样的线路,并且没有设法得到答案(也许我还不清楚),而且可以&#39我自己弄明白了。

问题的快速版本是:

是否有人可以了解是否有可能从控制器访问相关模型的属性?

它有点棘手,所以我会尝试解释上下文。

我有以下型号:

学生

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})

在我的模板中,我可以毫无问题地访问相关模型的属性。例如,像这样:

{{#each student in model}}
    {{student.name}}
    {{#each score in student.scores}}
          {{score.objective.name}}
          {{score.Result}}
    {{/each}}
{{/each}}

我最终想要做的是创造一个"得分"学生控制器上的属性,当我在其他地方选择目标时,它会加载适当的分数/结果。但是我在第一个障碍中摔倒了。

虽然我可以访问模板中相关模型的属性,但我似乎无法在控制器中看到。我期待我可以在学生控制器"

中做这样的事情。
score: function(){
    var selectedObjID = 5;
    return this.get('model.scores').findBy('objective_id', 1).get('scoreResult');

我已经尝试过我能想到的每一个变体,包括我在阅读指南/ api时所期望的。

我觉得我错过了一些显而易见的事情 - 当然,为了获得一些文档,这应该已经做好了吗?

在一条路线上也很重要 - 我不想通过另一条路线处理细节。

-------------------------------- 修改 ------- ---------------------

谢谢,我已经尝试过稍微调整一下代码,但我无法让它工作。您是否有机会根据上述型号帮助我纠正错误?

score: function() {
    var scores = this.get('model.scores');
    if (!scores) {
        return "No scores";
    }

    var score = scores.findBy('objective', 1);
    if (score === undefined) {
        return "Not resolved/No score";
    }

    return score.get('scoreResult');
}.property('model.scores.@each.objective')

1 个答案:

答案 0 :(得分:1)

  

虽然我可以在模板中访问相关模型的属性,但我似乎无法在控制器中使用。

基于此,我可以好好猜测你的问题是未解决的承诺。 Ember Data并不总是具有对相关模型的同步访问权限,因此它始终返回稍后将解决的承诺。更有可能的是,你正在尝试使用这个承诺,好像它已经解决了,即使它尚未解决。在根据Ember数据关系编写计算属性时,应始终编写属性,就像第一次通过获得空数据一样。通常这意味着检查空引用并确保在promise解析时更新属性。为了达到目的,这是你应该工作的财产:

score: function() {
    var scores = this.get('model.scores');
    if (!scores) {
        return;
    }

    var score = scores.findBy('objective_id', 1);
    if (score === undefined) {
        return;
    }

    return score.get('scoreResult');
}.property('model.scores.@each.objective_id')

此属性首次计算this.get('model.scores')时将为空PromiseArray,因此您无法从中获取任何数据。对于这些情况,只需返回并保持您的属性未定义(暂时)。但由于该属性依赖于model.scores.@each.objective_id,因此只要PromiseArray解析并且数据可用,该属性就会重新计算。因此,在运行2或3次之前,此属性将没有正确的值,但最终具有正确的值。在模板中使用属性时没有遇到这些问题的原因是因为Ember会为您解决这个问题。

很抱歉有很长的解释,但是在未解决的承诺和异步计算属性方面需要学习很多(比我发布的要多得多)。不幸的是,当你更多地学习Ember时,你会发现其中的一件事。如果我没有说清楚或上述属性不起作用,请在评论中告诉我,我会更新并尝试澄清。