我有这样的嵌套模型结构:
App.Survey = DS.Model.extend({
name: DS.attr('string'),
questions: DS.hasMany('question', {async: true})
});
App.Question = DS.Model.extend({
questionName: DS.attr('string'),
parentQuestionId: DS.attr('number'),
position: DS.attr('number'),
questionLayoutId: DS.attr('number'),
questionLayoutName: DS.attr('string'),
childQuestions: DS.hasMany('question', {async: true})
});
我将itemController设置为通过制作控制器来帮助为模型内容添加额外的“属性”:
App.QuestionsController = Ember.ArrayController.extend({
itemController: 'question'
});
App.QuestionController = Ember.ObjectController.extend({
needs: 'questions',
questions: Ember.computed.alias("controllers.questions"),
editMode: false,
hasChildren: function () {
return (this.get('childQuestions.length') > 0);
}.property('childQuestions'),
isBlockQuestion: function () {
return this.get('questionLayoutName') == "layout-block"
}.property('questionLayoutName')
});
因此,当我参加调查时,我可以在调查中看到问题列表。我的路线设置如下:
App.SurveyRoute = Ember.Route.extend({
model: function (params) {
return this.get('store').find('survey', params.survey_id);
},
setupController: function(controller, model){
this._super(controller, model);
this.controllerFor('questions').set('model', model.get('questions'));
}
});
现在有了这个设置,我只有根级问题的项目控制器的功能,但不是孩子级别的问题。我想知道是否有办法根据需要将模型数据绑定到适当的控制器。
这是一个用来演示我的问题的JSbin:http://jsbin.com/UROCObi/2/
可能有点太多了,但这个概念非常简单。调查可以有多个问题,一个问题本身可以有孩子问题(在我的情况下称为块问题)。正如您所看到的,我无法看到第三级问题,因为它没有封装在任何控制器中。我是否需要在SurveyRoute中为所有嵌套级别的childQuestion实例化ArrayController,或者还有其他更简洁的方法吗?
谢谢, 迪伊
答案 0 :(得分:1)
您可以使用:
{{#each questions itemController="question"}}
...
{{#each childQuestions itemController="childQuestion"}}
...
{{/each}}
{{/each}}
每个each
内的上下文分别是QuestionController和ChildQuestioncontroller的一个实例(我不确定命名约定)。
除非您还需要整体控制数组,否则无需使用ArrayController。