主要目标:使用.find()
访问当前控制器中可用模型以外的模型 - 以便将当前控制器模型中的数据与来自a的数据进行比较'外国'控制器的模型。
触发比较的原因是什么:
我在{{ action "isResponse"}}
模板中有一个按钮。此模板的控制器具有isResponse : function() {...}
我遇到的问题:每次点击按钮都会触发操作,但App.Answer.find()
仅在第二次点击后返回内容。 我想知道这是因为Answer
模型没有加载,但我不确定如何在我的示例中为isLoaded
正确设置观察者(如果这甚至是问题)
那么为什么App.Answer.find()在第一次被调用时返回空?
App.ChoiceController = Ember.ObjectController.extend({
chosen: false,
isResponse: function() {
// successfully returns what I want from this controller's model
var questionId = this.get('question.id')
// gets DS.RecordArray of the model i'd like to compare with
var answers = App.Answer.find()
// filter to get a result that matches this.get('question.id')
var answer = answers.filter(function(ans) {
// returns all entries that match
if(ans.get('question.id') == questionId) { return true }
}, 'answers.isLoaded'); // this observer doesn't seem to hurt or help
// get the final value I need
var choice = answer.mapProperty('choice.id')
// if choice array is not empty, (should only have 1 element anyways)
if(!choice) {
this.set('chosen', choice[0]);
} else {
this.set('chosen', false);
}
}
})
以下是涉及的模型。两者都包含DS.belongsTo属性
App.Choice = DS.Model.extend({
"question" : DS.belongsTo('App.Question')
})
App.Answer = DS.Model.extend({
"question" : DS.belongsTo('App.Question')
"choice" : DS.belongsTo('App.Choice')
})
App.Question = DS.Model.extend({
})
修改
这是显示行为的jsfiddle。确保打开浏览器控制台,注意每个按钮需要2次点击才能使操作isResponse
正常运行。 http://jsfiddle.net/iceking1624/QMBwe/
答案 0 :(得分:1)
在阅读您的评论后,我已经找回了您的问题的解决方案,一种可能的方法是您可以定义AnswerController
类型ArrayController
(因为它是一组答案)然后在ApplicationRoute
的{{1}}挂钩中设置此控制器。
主要目标:使用.find()访问当前控制器中可用模型以外的模型 - 以便将当前控制器模型中的数据与来自“外部”控制器模型的数据进行比较。
稍后,您可以要求使用setupController
API和AnswerController
从需要访问答案集合的控制器内部needs
访问needs:['answers']
数据,最后可以访问使用this.get('controllers.answer')
的数据。您可以在needs
API上找到有关here的更多信息。
在此处查看可行的正确解决方案,在1st
点击上显示正确的选择:
App.AnswerController = Ember.ArrayController.extend({});
App.ApplicationRoute = Ember.Route.extend({
setupController: function(controller, model) {
this.controllerFor('answer').set('content', App.Answer.find());
}
});
App.ChoiceController = Ember.ObjectController.extend({
needs: ['answer'],
chosen: false,
isResponse: function() {
var questionId = this.get('question.id');
var answers = this.get('controllers.answer');
var answer = answers.content.filter(function(ans) {
if(ans.get('question.id') == questionId) { return true }
}
var choice = answer.mapProperty('choice.id');
if(!choice) {
this.set('chosen', choice[0]);
} else {
this.set('chosen', false);
}
}
});
这是一个有效的fiddle。
希望它有所帮助。