ember.js - 使用 Ember 中的 Controller 存储用户对调查问卷的回答

标签 ember.js

我正在使用 Ember 创建一个分析器应用程序(就像您有时在杂志上看到的性格测验之一)。它提出了一系列 10 个问题,每个问题有 7 个多项选择答案,每个答案都有不同的分配分数。每个回答都会加起来,满分 100 分。用户最终将能够存储他们的答案,以便日后重做,看看是否有所改进。

但是对于 Ember(非常)陌生,我一直坚持收集用户响应并将其存储为个人记录。

我的问题是,我使用 QuestionsController 从 Fixture(问题)加载问题及其可能的答案(一个单独的相关 Fixture)。

因此,当有人点击答案时(例如使用按钮,但当我认真思考时,我可能会使用单选按钮),它会捕获他们的响应......但接下来我该怎么办?

我认为最好的方法是有一个单独的 ResponseController 来创建各个响应的记录(然后我可以汇总这些记录),但 Ember 希望捕获的响应由 QuestionsController 处理,而不是由 ResponseController 处理(这就是我认为应该这样做)。

我似乎不知道如何做到这一点,特别是 Ember 的所有不同部分如何组合在一起并跨 Controller 交互。

Javascript

// Models

App.Question = DS.Model.extend ({
label: DS.attr('string'),
    answers: DS.hasMany('App.Answer')
    });

App.Answer = DS.Model.extend ({
    question: DS.belongsTo('App.Question'),
    label: DS.attr('string'),
    value: DS.attr('number')
});

App.Response = DS.Model.extend ( {
    question:   DS.attr('string'),          // Question_id that was responded to
    score:      DS.attr('number'),          // The score of the selected answer
    answer:     DS.belongsTo('App.Answer')  // The answer 
    });

// Controllers

App.QuestionsController = Ember.ArrayController.extend( {

    select: function( question, score, answer ) {      

    // this next bit is clearly not right, but I don't know why...
        App.Response.storeResponse( question, score, answer );


    }
});

App.ResponseController = Ember.ObjectController.extend( { 

    storeResponse: function( question, score, answer ) {

    // this next bit is clearly not right, but I don't know why.
        createRecord ( { question: question, score: score, answer: answer  } ); 
    }
});

HTML

<!-- The Template for the Questionnaire -->

<script type="text/x-handlebars" id='questions'>
<H2>Questions</H2>
{{#each question in controller}}
    <div><span>{{question.id}}</span> {{question.label}}</div>
    <div>{{partial "answer"}}</div>
{{/each}}
</script>

<!-- The Template for the Answers -->

<script type="text/x-handlebars" id='_answer'>
<ul>
{{#each answer in question.answers}}
    <li><button {{ action "select" question.id answer.value answer.id }}{{answer.label}}</li></button></li>
{{/each}}
</ul>
</script>

进展

我的模板工作正常;它正确地显示问题和答案(或者至少按照我的预期)。该按钮正在捕获正确的响应。但我真的不知道如何将数据从那里获取到存储中。

我在控制台中得到的响应各不相同(取决于我尝试解决的问题),从“未定义”到“找不到变量 storeResponse”。

最佳答案

您可以使用needs API 跨 Controller 进行通信。例如,您可以声明 QuestionController 需要访问 ResponseController

needs: ['response'],
responseBinding: 'controllers.response',

然后,Ember 会将响应 Controller 实例注入(inject)到 QuestionController 中,可以使用 this.get('response') 访问该实例。然后您的 select 操作处理程序可以对其调用 storeResponse

select: function( question, score, answer ) {      
  var controller = this.get('response');
  controller.storeResponse(question, score, answer);
}

关于ember.js - 使用 Ember 中的 Controller 存储用户对调查问卷的回答,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17639262/

相关文章:

ember.js - Ember + Ember 数据: How to rollback a record after calling deleteRecord()

ember.js - 如何在我的 View 中绑定(bind) jquery 事件

html - EMBER - 每个处理程序都围绕我的组件生成 ember-view div

ember.js - 在 PUT 请求中包含响应时,Ember Data 重新加载关联

javascript - Ember.js 有很多关系在渲染前未解析

devise - 创建带有实时验证的 Ember 表单的最佳实践是什么?

json - Ember-cli-dependency-checker - 无效版本 : *

javascript - Ember 需要 API;引用错误: controllers is not defined

ember.js - 在emberjs中获得模型的第一条记录

javascript - 用于共享数据的 Ember 应用程序 Controller