Я использую Ember для создания приложения-профилировщика (как, например, один из тех личностных опросов, которые вы иногда попадаете в журналы). Он представляет собой серию из 10 вопросов, каждая из которых содержит 7 ответов с несколькими вариантами ответов, причем каждый ответ имеет разную распределенную оценку. Каждый ответ добавляется до 100 баллов. Пользователи в конечном итоге смогут хранить свои ответы, чтобы они могли повторить его позже, чтобы узнать, улучшились ли они.Сохранение ответов пользователей на вопросники с использованием контроллеров в Ember
Но будучи (очень) новым для Ember, я застрял в сборе и хранении ответов пользователей как отдельных записей.
Моя проблема в том, что я использую QuestionController для загрузки в вопрос из Fixture (Question) вместе с его возможным ответом (отдельным связанным устройством).
Поэтому, когда кто-то нажимает на ответ (например, с помощью кнопки, но когда у меня есть голова вокруг него, я, вероятно, буду использовать радиокнопки), он захватывает их ответ ... но что мне с ним делать? следующий?
Я думал, что наилучшим подходом было бы иметь отдельный ResponseController, который создавал записи отдельных ответов (которые я мог бы затем суммировать), но Ember ожидает, что захваченные ответы будут обрабатываться с помощью QuestionController, а не ResponseController (который что я думаю ДОЛЖЕН это делать).
Кажется, я не понимаю, как это сделать, особенно, как все разные части Ember подходят друг другу и взаимодействуют между контроллерами.
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».
Благодарим вас за такой ясный ответ и пример. Я вернусь и дам вам знать результат. – thinquarium
Он работает! Я терялся, поскольку многие из найденных мной примеров были либо устаревшими, либо только предоставленными фрагментами, которые не объясняли, как правильно применять его. Еще раз спасибо. – thinquarium
Добро пожаловать. :) –