使用淘汰赛Js将嵌套数组呈现为HTML时,我的逻辑怎么了?

时间:2018-12-20 23:29:35

标签: javascript html json knockout.js

我正在制作一个项目的原型,并且有一堆凌乱的代码。我所坚持的原型的特定部分是无法使用敲除从JSON文件进行迭代和渲染嵌套数组。以下是一些事实:

  • 作为问题的特定键的值是一个列表。
  • 我在JSON“响应”中引用的每个项目都是“问题”和“答案”
    • 问题只是一个字符串
    • 答案是清单
  • 我将“答案”中的每个项目分解并插入html中的单选按钮
  • 当敲除完成任务时,每个项目将通过单选按钮呈现的每个迭代一起返回。
  • qna obj来自一个函数,该函数通过基于“ sub”调用json文件来过滤输入,从而删除顶部节点,仅留下

这里是这种情况的样子[很抱歉,没有足够的表示点来嵌入图像,tinypic必须这样做!]

http://i64.tinypic.com/25i26xl.png

我是使用剔除js的新手,我已经阅读了官方文档,但坦白地说,我在理解它方面有些麻烦

在这里出现代码行问题,任何建议将不胜感激。

//questions.json
[
      {
        "question": "Are you a buyer, seller or renter?",
        "answers": ["Buyer", "Seller", "Renter"]
      },
      {
        "question": "Second question",
        "answers": ["yes", "no"]
      }
   ]

1

// functions.js
function questionDisplay() {
  var self = this;
  self.data = ko.observableArray(qna);
}

function initQuestionDisplay() {
  var qnaDataModel = new questionDisplay();
  $("#questionsDisplay").modal("show");
  ko.applyBindings(qnaDataModel);
}

2

<!-- test.html --!>
<div
            class="modal-body"
            data-bind="template: {name: 'template', data: $data}"
          ></div>
          <script type="text/html" id="template">
            <div class="diplay-frame" data-bind="foreach: {data: data, as: '_data'}">
              <div class="question-box">
                  <h2 class="question" data-bind="text: _data['question']"/>
                  <p class="answers" data-bind="text: _data['answers']"/>
                  <div data-bind="foreach: _data['answers']">
                      <input type="radio" name="optionsGroup" data-bind="checked: _data['answers']" />
                      <span data-bind="text: _data['answers']"></span>
                  </div>

1 个答案:

答案 0 :(得分:1)

你是如此亲密。不过要注意几件事。

  • 当您想用敲除js绑定内容时,请尽可能在<p data-bind="text: item"></p>之类的自结束标签上使用<p data-bind="text: item" />之类的结束标签。规则的例外是那些自封闭的标签,例如<input data-bind="value: somevalue" />。这将消除一系列的错误。我已经被很多次抓住了。
  • 单选按钮需要按名称分组,以便所选值仅适用于命名的单选按钮组。这会将所选答案限制为仅与答案相关的问题,而不是页面上呈现的所有答案。

var vm = {arrayOfItems : [ 'item1','item2']}
<ul data-bind="foreach: arrayOfItems"> <li data-bind="text: $data"></li> </ul>

  • 当您位于foreach绑定标记内时,可以使用称为$data的当前迭代数据上下文来引用当前项目。
    在这里可以找到更好的解释。 -Knockout Binding Context

我提供了一个使用您提供的示例的工作示例。

有一个“学习”部分,它将带您完成有关使用Knockoutjs的相当全面的教程。

var qna = [
      {
        "questionId": "1",
        "question": "Are you a buyer, seller or renter?",
        "answers": ["Buyer", "Seller", "Renter"]
      },
      {
        "questionId": "2",
        "question": "Second question",
        "answers": ["yes", "no"]
      }
   ];
   
// functions.js
function questionDisplay() {
  var self = this;
  var mappedData = qna.map(function(item){
    item.optionGroupName = "optionGroup_" + item.questionId;
    item.selectedAnswer = ko.observable();
    return item;
  });
  self.data = ko.observableArray(mappedData);
}

function initQuestionDisplay() {
  var qnaDataModel = new questionDisplay();
  //$("#questionsDisplay").modal("show");
  ko.applyBindings(qnaDataModel);
}   

initQuestionDisplay();
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<div class="modal-body" data-bind="template: {name: 'template', data: $data}"></div>
<script type="text/html" id="template">
<div class="diplay-frame" data-bind="foreach: {data: data, as: '_data'}">
  <div class="question-box">
    <h2 class="question" data-bind="text: _data['question']"></h2>
    <p class="answers" data-bind="text: _data['answers']"></p>
    <div data-bind="foreach: {data: _data['answers'], as: 'answer'}">
      <input type="radio"  data-bind="checked: $parent.selectedAnswer, attr:{name: $parent.optionGroupName, value: $data}" />
      <span data-bind="text: answer"></span>
    </div>
  </div>
</div>
</script>

<h2>Results</h2>
<ul data-bind="foreach: data">
  <li>
    Question: <span data-bind="text: question"></span>
    Answer: <span data-bind="text: selectedAnswer"></span>
  </li>
</ul>