2013-07-14 7 views
2

Я использую 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».

ответ

4

Вы можете использовать api needs для связи между контроллерами. Например, вы можете объявить, что QuestionControllerneeds доступа по к ResponseController с,

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

Ember будет впрыскивать экземпляр контроллера в ответ QuestionController, которые могут быть доступны с this.get('response'). Затем ваш обработчик действий select может вызвать на нем storeResponse.

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

Благодарим вас за такой ясный ответ и пример. Я вернусь и дам вам знать результат. – thinquarium

+0

Он работает! Я терялся, поскольку многие из найденных мной примеров были либо устаревшими, либо только предоставленными фрагментами, которые не объясняли, как правильно применять его. Еще раз спасибо. – thinquarium

+0

Добро пожаловать. :) –

 Смежные вопросы

  • Нет связанных вопросов^_^