Как показать значение каждого флажка вместо выбранного значения места

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

Я хотел добавить/показать значения выбранного флажка. Я могу добиться этого частично, но текущая проблема заключается в том, что если я выбираю один флажок, он показывает 1-е значение, на двух флажках он показывает 2-е значение 2 раза вместо 1-го и 2-го, на трех флажках он показывает 3-е значение 3 раза вместо 1-го, 2-й, 3-й.

Посмотреть можно здесь: https://angular-ivy-d2gbad.stackblitz.io/ нажимайте на каждую строку, чтобы увидеть форму

Код: https://stackblitz.com/edit/angular-ivy-d2gbad?file=src%2Fapp%2Fapp.component.html

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
215
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Пожалуйста, обновите свою функцию addSubData, как показано ниже -

addSubData(user: any) {
    let i: any;
    i = document.querySelectorAll('input[type = "checkbox"]:checked');
    for(var checked of i) {
      const newUser = Object.assign({}, user)
      newUser.dl = checked.value;
      newUser.sub_impact = "Applicable";
      newUser.co_score = "Added";
      this.userObj.assigned_to.push(newUser);
    }  
  }

Проблема заключалась в том, что вы присваивали значения одному и тому же объекту пользователя. Таким образом, он также обновлял значения в массиве. Вам нужно клонировать свой пользовательский объект, используя Object.assign.

Кроме того, вы просматривали массив по индексу, чтобы получить значение, но индекс k-1 всегда будет возвращать одно и то же значение в цикле for, поскольку они постоянны в цикле for. Я обновил код, так что он подхватывается из самого флажка.

Помимо этого, есть небольшие проблемы, которые, я думаю, вы получите, как только решите эту проблему.

спасибо @nikhil-patil, не могли бы вы помочь мне с мелкими проблемами, о которых вы говорите? может быть, я смогу решить это раньше, прежде чем тестер поднимет

Kunal Vijan 24.12.2020 13:53

Пожалуйста, переосмыслите более «угловой способ». использовать querySelectorAll(..) для проверки не является хорошим подходом

Eliseo 24.12.2020 13:55

@KunalVijan, я имел в виду такие проблемы, как - addSubData, при повторном вызове он не очистит предыдущий добавленный список. Я не уверен, хотите ли вы очистить его или нет?

Nikhil Patil 24.12.2020 16:11

@Элизео, ты прав. Лучше напрямую связывать значения из HTML, а не через DOM. Поскольку нужно было пройти много кода, я просто решил проблему.

Nikhil Patil 24.12.2020 16:17

@NikhilPatil, могу я попросить что-нибудь еще? Я хотел выполнить поиск по существующим данным n, если это соответствует отключению этого флажка, чтобы он не позволял пользователю добавлять повторяющиеся записи.

Kunal Vijan 03.01.2021 21:24

@NikhilPatil я могу сравнить this.userObj.assigned_to.forEach((row:any) => { this.dlCategory.findIndex((element,index) => { if (element.value === row.dl) { } }); }); но как мне скрыть флажок, соответствующий случаю if

Kunal Vijan 03.01.2021 22:29

@KunalVijan, можешь добавить свой stackblitz?

Nikhil Patil 04.01.2021 07:08

@NikhilPatil, пожалуйста, обратитесь к этому: stackblitz.com/edit/… как только вы нажмете на любую запись, вы получите флажки Select DL. Я хочу убедиться, что если данные уже добавлены, пользователь не сможет добавить дубликат dL

Kunal Vijan 04.01.2021 14:18

@KunalVijan, пожалуйста, проверьте это - stackblitz.com/edit/angular-ivy-mwbryf

Nikhil Patil 06.01.2021 07:46

Ваш код немного запутан. На самом деле я не могу представить, что вы хотите сделать это, Но..

Первый. Когда у нас есть ввод, в Angular мы используем [(ngModel)] = "variable". Это означает, что в нашем .ts у нас есть значение переменной, а в .html мы показываем значение переменной.

Итак, определите четыре переменные в вашем .ts

gender:string
impact:string
fromDate:any
toDate:any

И ваша «форма» для подачи заявки должна быть похожа на

Gender:<select [(ngModel)] = "gender">
   ...
</select>
Impact:<select [(ngModel)] = "impact">
   ...
</select>
<input type = "date" [(ngModel)] = "fromDate">
<input type = "date" [(ngModel)] = "toDate">
          class = "form-control form-control-sm"
          name = "gender"
          ngModel
          [ngModelOptions] = "{updateOn: 'submit'}"
        >

Idem, когда вы перебираете категории, вы можете использовать вспомогательный массив

categories:boolean[]=[]

И использовать

<ul *ngFor = "let list of dlCategory">
    <div class = "form-check form-check-inline">
        <input type = "checkbox" [(ngModel)] = "categories[i] 
              name = "{{list.name}}">
        <label class = "form-check-label" for = "">{{list.label}}</label>
     </div>
 </ul>

Что ж, я рассказал вам в вашем посте перед тем, как «преобразовать» список проверенных значений в массив с проверенными значениями, это ТАК

Поэтому вместо создания массива логических значений с true, false мы собираемся сделать так, чтобы свойство «пользователя» стало с выбранными значениями.

<ul *ngFor = "let list of dlCategory">
    <div class = "form-check form-check-inline">
        <input #check type = "checkbox" 
              [ngModel] = "user.categories.indexOf(list.name)>=0" 
              (ngModelChange) = "onChange(list.name,check.checked)"
              name = "{{list.name}}">
        <label class = "form-check-label" for = "">{{list.label}}</label>
     </div>
 </ul>

И onChange становится похожим

  onChange(option:string,checked:boolean)
  {
     if (checked && this.user.categories.indexOf(option)<0)
         this.user.categories=[...this.user.categories,option]
         .sort((a,b)=>this.dlCategory.findIndex(x.name==a)>this.dlCategory.findIndex(x.name==b)?1:-1)
    if (!checked)
          this.user.categories=this.user.categories.filter(x=>x!=option)
  }

Наконец, когда мы хотим показать данные категорий, мы можем перебрать dlCategory и показать, только если кошка находится в user.categories.

<div *ngFor = "cat of dlCategories;let i=index>
  <ng-container *ngIf = "user.categories.indexOf(cat.name)>=0">
     {{cat.name}}{{cat.value}}
  <ng-container>
</div>

ПРИМЕЧАНИЕ. Я спешу, возможно, в коде есть синтаксическая ошибка, но я надеюсь, что ответ поможет вам несколько

Другие вопросы по теме