我一直在询问一些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')
答案 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时,你会发现其中的一件事。如果我没有说清楚或上述属性不起作用,请在评论中告诉我,我会更新并尝试澄清。