【问题标题】:JQuery Multidimensional Array or Object Or Other Approach?JQuery 多维数组或对象或其他方法?
【发布时间】:2012-02-09 19:27:57
【问题描述】:

基本上,我所拥有的是一份非常动态且本质上由数据驱动的问卷...

对于每个问题,我可以有一个 问题编号, 0个或多个单选按钮选项, 0个或多个复选框选项, 然后对于每个选项单选按钮,我将有一个 选项编号, 价值 对于每个选项复选框,我都会有一个 选项编号, 价值 对于文本区域的每个选项,我都会有一个 选项编号, 价值 如果我没有选项,我可以有一个 yes no 单选按钮组,它会有一个 问题编号, 价值 如果我没有选择,我也可以有一个 textarea,它会有一个
问题编号, 价值

我的一切都按照我想要的方式呈现,并且我在 jquery 中的更改和点击事件在我期望它们时触发...

目前在我的 JQuery 中的问题是我正试图找出一种方法来保存所有这些问题的答案,因为它们被回答,如果它们被更改更新或替换我之前存储的内容......

一旦用户完成答案并进行适当的编辑,我将在基于 mvc3 的解决方案中将 jquery/json 发布到我的控制器;如果我能得到我需要什么样的 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...
    });

我使用这种方法遇到的问题是,每当单击复选框、单选按钮或更改文本区域中的值时,我都必须弄清楚我已经为适用的问题编号添加到结构中的内容,然后更新任何内容适用或只是替换适用的...

我想我已经过分复杂化了,肯定会喜欢一种更优雅的方法......

提前致谢。

更新: 仍然没有想出办法让这件事继续下去,希望有人能让我朝着正确的方向前进......

【问题讨论】:

    标签: jquery arrays multidimensional-array


    【解决方案1】:

    我不得不做与此类似的事情。 如果您将其作为应用程序进行,并且需要离开该页面......也许可以考虑将答案保存在 cookie 中。我建议使用本地数据库,但目前看来,本地数据库还悬而未决。

    如果您停留在同一页面上,则可以考虑使用 javascript 变量或 javascript 窗口变量。然后,在onchange事件上,查看之前保存的值,看值是否已经变为正确答案等。

    如果您将其作为网页而不是应用程序来执行,则可以使用 php 或服务器端的东西来存储对象或数组。

    【讨论】:

      【解决方案2】:

      我认为您需要两个结构。第一个将保存所有问题和选项,而第二个将保存答案。由于您的问题“模板”对于调查的所有参与者都是相同的,因此您可以以 JSON 格式传递该 JS 对象,并在需要显示问题和答案组合的任何时候使用它。

      您将使用的第二种结构仅用于在将答案发布回服务器之前保留答案。请参阅下面的示例:

      一、实际问卷的持有对象:

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

      并为每个问题重复“问题:”中的对象。指定类型,然后使用您的 jQuery 代码创建适当的单选、复选框、文本区域等元素。显然在某些情况下不需要“选项”数组(例如 textarea)。

      对于存储答案,它更加容易。只需构建一个数组并从那里开始。

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

      每次记录答案时(您可以使用“onchange”事件),调用 recordAnswer() 并传入问题编号和提供的答案。用户更新的任何问题都会自动覆盖之前的答案。

      当您准备好发布您的数据时,只需将对象转换为 JSON,并通过适当的 jQuery Ajax 方法。

      另一方面,如果您需要发布所有内容(包括问题模板),只需遍历可用问题并在 answers 数组中查找与当前问题相同编号的元素,并将答案记录在第一个对象模板。然后 POST 到服务器。

      这是几种方法。希望其中一个对你有用:)

      【讨论】:

      • 我不太关注你...我所有的问题都是动态的,我可以有没有单选按钮组,以及每个问题的单选按钮列表和复选框列表和文本区域,我可以有n 在任何给定时间显示的可分页问题的数量...我无法静态定义...
      • 在 jquery 代码中我可以看到如何为一个适用的问题添加 0 个或多个项目的每个单独的数组......但是当我说我有一个复选框列表时,我看不到如何继续0 个或多个文本区域,例如同一个问题;当每个事件的单击和更改事件分别触发时......所以说更改事件触发并选择了一个复选框并将其值和问题编号添加到我要发布的进程数组中......然后一些文本是键入属于同一问题的文本框...如果我添加相同的问题编号和当前值,我将丢失信息。
      • 我的方法仍然适用于你。记录您的答案时,只需像这样处理您的数组: answers[qNum]['textarea'] = answer;因此,每个问题的数据结构如下: answer = { 0: { textarea: "", radio: ""} } 等等。您可能需要按照您在调查问卷中阅读的内容设置结构,但这应该是微不足道的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 2012-08-09
      • 2020-09-10
      • 2014-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多