单选按钮中的 Angular-Handle 嵌套数组

Angular-Handle nested array in radio-button

提问人:Netranjit Borgohain 提问时间:6/26/2023 更新时间:6/26/2023 访问量:60

问:

我正在处理一个项目,我必须使用嵌套数组 这是数据的虚拟版本

 options = [
   {
     value: 1,
     text: 'Cheeseburger',
     content: [
       { id: 101, name: 'Cheese' },
       { id: 102, name: 'Bread' },
       { id: 103, name: 'Veggies' },
     ],
   },
   {
     value: 2,
     text: 'Taco',
     content: [
       { id: 201, name: 'Nun' },
       { id: 202, name: 'Veggies' },
       { id: 203, name: 'Sauce' },
     ],
   },
 ];

使用它,我必须使用单选按钮制作 MCQ 风格的问答。虽然我能够设置问题和答案。我面临两个问题。

  1. 我有一个“添加更多”按钮,单击该按钮时会创建一个新的空问题和答案集(克隆“选项”)。但是在这样做时,即使我可以看到答案存储在数组中,先前选择的选项也会被取消选择。
  2. 我必须修补对此单选按钮的 API 响应。 这是 API 响应的虚拟版本:
 res = [
      [102, 201],
      [101, 202],
    ];

我希望相应地选择选项,即在虚拟数据中有两个数组。然后在 UI 中,问题和答案应该有两个 two 集,并且要根据 contents 数组的 id 和 res 的 id 来选择选项。

对于 1, 我做到了

  addMoreQuestions() {
    const existingQuestionSet = this.questionandAnswer[0].slice();
    console.log('existingQuestionSet =>', existingQuestionSet);

    this.questionandAnswer.push(existingQuestionSet);
    console.log('this.questionAnswer =>', this.questionandAnswer);

    // Copy the selected options for the previous question sets
    const previousSelectedOptions = [...this.selectedOptions];

    this.answers.push(previousSelectedOptions);
    console.log('answer =>', this.answers);

    // Reset selectedOptions only for the new question set
    this.selectedOptions = [];
  }

在这里,我看到在questionandAnswer中推送一个新数组,但是在这样做时,先前选择的选项被取消选择。但我可以在“this.answers”中看到它 对于2,我想不出继续前进的方法。 谁能帮忙? 这是 stackblitz 链接

提前感谢您的帮助。

JavaScript Angular TypeScript 按钮 单选组

评论

0赞 Julian W. 6/26/2023
由于 而重置选择。你这样做的原因是什么?您在 HTML 中使用,因此当您重置时,这些选择也会重置。this.selectedOptions = [];[(ngModel)]="selectedOptions[i]"selectedOptions
0赞 Netranjit Borgohain 6/26/2023
@JulianLin我需要这个,因为我希望选项在数组的数组中。就这样res = [ [102, 201], [101, 202], ]

答:

-1赞 Ramesh Kumar 6/26/2023 #1
  1. 您需要确保每个问题的选定选项 设置得到妥善维护。实现这一目标的一种方法是保持 每个问题集的选定选项数组。

    addMoreQuestions() {
      const existingQuestionSet = this.questionandAnswer[0].slice();
      console.log('existingQuestionSet =>', existingQuestionSet);
    
      this.questionandAnswer.push(existingQuestionSet);
      console.log('this.questionAnswer =>', this.questionandAnswer);
    
      // Copy the selected options for the previous question set
      const previousSelectedOptions = [...this.selectedOptions];
    
      this.answers.push(previousSelectedOptions);
      console.log('answers =>', this.answers);
    
      // Reset selectedOptions only for the new question set
      const newQuestionSetSelectedOptions = Array(existingQuestionSet.length).fill(null);
      this.selectedOptions.push(newQuestionSetSelectedOptions);
    }
    
  2. 根据 API 响应选择选项的第二个问题,您 可以遍历 res 数组并将值用作索引 在每个问题集中选择相应的选项。

    // Assuming `res` and `options` are accessible in the current scope
    for (let i = 0; i < res.length; i++) {
      const answerSet = res[i];
      const questionSet = this.questionandAnswer[i];
    
      for (let j = 0; j < answerSet.length; j++) {
        const answerId = answerSet[j];
    
        // Find the corresponding option for the answerId
        const option = questionSet.content.find(content => content.id === answerId);
    
        if (option) {
          // Set the corresponding index as selected
          const optionIndex = questionSet.content.indexOf(option);
          this.selectedOptions[i][j] = optionIndex;
        }
      }
    }
    

评论

0赞 Netranjit Borgohain 6/26/2023
两者都不起作用。
0赞 Ramesh Kumar 6/26/2023
请尝试新代码,确保在初始化 options 数组、填充 this.questionandAnswer 数组和呈现 UI 之前执行此代码。
0赞 Ramesh Kumar 6/26/2023
告诉我你有什么错误。
0赞 Netranjit Borgohain 6/26/2023
不起作用 对于第一个,我这样做了,我希望输出是这个 [[101,202],[null null]](第二个数组具有 null 值,因为没有从新的问题集中选择任何选项。检查 stackblitz 以更好地了解问题ngDoCheck(): void { console.log('checking ->', this.selectedOptions); console.log('answers =>', this.answers); }checking -> [101, 202, Array[2]]
2赞 DavidW 6/26/2023
这个答案(以及你最近的许多其他答案)看起来像 ChatGPT