JQuery Многомерный массив или объект или другой подход? - PullRequest
2 голосов
/ 13 января 2012

По сути, у меня есть анкета, которая очень динамична и основана на данных ...

для каждого вопроса я могу иметь номер вопроса, 0 или более опций переключателей, 0 или более вариантов флажков, тогда для каждой опции переключателя у меня будет идентификатор опции, значение и для каждого флажка опции у меня будет идентификатор опции, значение и для каждого варианта, который является текстовой области, у меня будет идентификатор опции, значение Если у меня нет вариантов, у меня может быть группа переключателей да нет, которая будет иметь идентификатор вопроса, значение Если у меня нет вариантов, у меня также может быть текстовая область, которая будет иметь
идентификатор вопроса, значение

У меня все отображается так, как я хочу, и мои изменения и нажатия в jquery запускаются, когда я ожидаю, что они ...

Проблема В моем JQuery на данный момент я пытаюсь найти способ сохранить ответы на все эти вопросы по мере их ответа, и если они изменяются, обновите или замените то, что я ранее хранил ...

Как только пользователь завершит работу с ответами и отредактирует их соответствующим образом, я опубликую jquery / json на моем контроллере в моем решении на основе mvc3; если я смогу понять, какая структура Jquery мне нужна, я понял, что мне пора ...

Подход к структуре, необходимой для этого в JQuery, вызывает у меня головную боль ...

В данный момент я думаю о чем-то вроде следующего ...

   var $ArrayToPost = [];

    var $questionare =
    {
        Questions: {
            QuestionNumber: null,
            Options: [],
            YesNo: [],
            TextArea: []
        }
    };

    $('input.Questionare, textarea.Questionare').live({
      click: function (e) {
      ...rest omitted for brevity...
      $questionare.Questions.QuestionNumber = $QuestionNbr;
      $questionare.Questions.Options.push($CheckBox);

      $ArrayToPost.push($questionare);

      ...rest omitted for brevity...
      change : function (e) {
      ...rest omitted for brevity...
    });

Проблема, с которой я сталкиваюсь при таком подходе, заключается в том, что всякий раз, когда устанавливается флажок, переключается кнопка или изменяется значение в текстовой области, мне необходимо выяснить, что я уже добавил в структуру для соответствующего номера вопроса, и либо обновить любое применимо или просто заменить то, что применимо ...

Я думаю, что я слишком усложняю это и определенно хотел бы более элегантный подход ...

спасибо заранее.

ОБНОВЛЕНИЕ: Все еще не придумали способ добиться этого, надеюсь, кто-нибудь может заставить меня двигаться в правильном направлении ...

Ответы [ 2 ]

0 голосов
/ 13 января 2012

Я думаю, вам нужны две структуры для этого.Первый будет содержать все вопросы и варианты, а второй содержит ответы.Поскольку ваш «шаблон» вопроса будет одинаковым для всех участников опроса, вы можете передать этот объект JS в формате JSON и использовать его в любое время, когда вам нужно отобразить комбинации вопросов и ответов.

Второйструктура, которую вы будете использовать, будет использоваться только для хранения ответов перед отправкой их обратно на сервер.См. Мои примеры ниже:

Во-первых, объект для хранения актуального вопросника:

var questionnaire = {
    Questions : [
        {
            number: 1,
            type: 'Radio'
            options: ['Choice 1', 'Choice 2', 'Choice 3']
        }
    ]
};

И повторяйте объект внутри «Вопросы:» для каждого вопроса.Укажите тип, а затем используйте код jQuery для создания соответствующих элементов radio, checkbox, textarea и т. Д.Очевидно, что в некоторых случаях массив «options» не нужен (например, textarea).

Для хранения ответов это еще проще.Просто создайте массив и идите оттуда.

var answers = [

];

function recordAnswer(qNum, answer) {
    answers[qNum] = answer;
}

Каждый раз, когда ответ записывается (вы можете использовать событие «onchange»), вызываете recordAnswer () и передаете номер вопроса и предоставленный ответ.Любой вопрос, который пользователь обновляет, автоматически переопределит предыдущий ответ.

Когда вы будете готовы отправить свои данные POST, просто преобразуйте объект в JSON и пропустите соответствующий метод jQuery Ajax.

С другой стороны, если вам нужно POST все (включая шаблон вопроса), просто циклически просматривайте доступные вопросы и ищите элемент в массиве ответов с тем же номером, что и текущий вопрос, и запишите ответ в этом первомшаблон объекта.Затем отправьте сообщение на сервер.

Это пара способов сделать это.Надеюсь, что один из них работает для вас:)

0 голосов
/ 13 января 2012

Я должен был сделать что-то похожее на это. Если вы делаете это как приложение и хотите покинуть эту страницу ... возможно, посмотрите, как сохранить ответы в файлах cookie. Я бы предложил локальную базу данных, но, похоже, в данный момент локальные базы данных находятся в эфире, и вперед.

Если вы остаетесь на той же странице, то переменные javascript или переменные окна javascript - это мысль. Затем, при событии onchange, посмотрите на ранее сохраненное значение, чтобы увидеть, изменилось ли значение на правильный ответ и т. Д.

Если вы делаете это как веб-страницу, а не как приложение, вы можете использовать php или что-то на стороне сервера для хранения объекта или массива.

...