控制器支持嵌套模型数据

时间:2013-12-11 20:55:19

标签: ember.js ember-data

我有这样的嵌套模型结构:

  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,或者还有其他更简洁的方法吗?

谢谢, 迪伊

1 个答案:

答案 0 :(得分:1)

您可以使用:

    {{#each questions itemController="question"}}
            ...
            {{#each childQuestions itemController="childQuestion"}}
                   ...
            {{/each}}

    {{/each}}

每个each内的上下文分别是QuestionController和ChildQuestioncontroller的一个实例(我不确定命名约定)。 除非您还需要整体控制数组,否则无需使用ArrayController。