Как сделать дочерние элементы для отображения при поиске и показать все элементы по щелчку всех, используя angular2 primeng

#javascript #angular

#javascript #угловатый

Вопрос:

у меня есть поле ввода для поиска и алфавиты, все. Эти вещи нужно искать на основе входных данных. Теперь я ищу алфавит m , он выдает мне дочерний список, но когда я нажимаю на ALL него, элементы не сбрасываются. Сценарий: Сначала нажмите на кнопку слева от "p-test17" , чтобы мы могли увидеть список дочерних элементов. Теперь нажмите M или выполните поиск "m" , указав клавишу ввода, и дочерние элементы будут отображаться с помощью m. Теперь нажмите на ALL , он должен сбросить все, но вместо этого он не показывает все дочерние элементы, "p-test17" как это было показано на начальном шаге.

Пожалуйста, помогите.

ТС:

 searchFacility(search) {
    this.sLetter = search;
    let memberFacilities = true;
    if (search) {
      this.dtFacilities.expandedRows = [];
      setTimeout(() => {
        this.dtFacilities.expandedRows = this.dtFacilities.value;
        console.log(this.dtFacilities.value,"this.dtFacilities.value")
        this.dtFacilities.value.forEach(m => {
          m.memberFacilities.forEach(f => {
            let mySearch = search.toLowerCase();
            let facilityName = f.facilityName.toLowerCase();
            if (facilityName amp;amp; facilityName.includes(mySearch)) {
              f.isShowMember = false;
              memberFacilities = false;
            } else {
              f.isShowMember = true;
              memberFacilities = true;
            }
          })
        })
        if (memberFacilities) {
          this.dtFacilities.expandedRows = [];
        } 
      }, 100);

    }
    if (search == "") {
      this.dtFacilities.expandedRows = [];
      this.dtFacilities.expandedRows = this.medicalOfficesList;
      this.medicalOfficesList.forEach(m => {
        m.memberFacilities.map(f => {
          f.isShowMember = false;
        })
      }) 
    }
    else {
      this.dtFacilities.expandedRows = [];
      this.dtFacilities.value.forEach(m => {
        m.memberFacilities.map(f => {
          f.isShowMember = false;
        })
      })

    }
  }
 

ДЕМОНСТРАЦИЯ: ДЕМОНСТРАЦИЯ

Ответ №1:

В app.pipe.ts в строке 22 прямо перед mainArr.forEach(element => { добавлением:

 mainArr = mainArr.map(e => {
  return {...e};
});
 

Проблема в том, что когда вы проходите medicalOfficesList по searchMedicalOffices каналу, вы заменяете memberFacilities on mainArr (который в данном случае является medicalOfficesList ) на новый отфильтрованный массив. Добавив новый код выше в строку 22, вы создадите новую (неглубокую) копию каждого объекта mainArr перед заменой его memberFacilities свойства. Таким образом, оригинал medicalOfficesList останется неизменным.

Комментарии:

1. Нет, слишком много кода, чтобы просто вставить все это. Если вы начнете с версии stackblitz и сделаете так, как я описал в первых 2 абзацах, он начнет работать. Всего 1 новая строка кода и эти 6 строк для раскомментирования. Это единственные необходимые изменения.

2. Пожалуйста, проверьте демо-версию, я обновил так же, как вы предложили

3. Похоже, демо-версия уже работает. После нажатия кнопки «M» отображаются только 2 дочерних элемента, а после нажатия кнопки «ВСЕ» все 6 дочерних элементов отображаются снова.

4. Да, это именно то, что я предложил. Работает ли это так, как вы хотите, чтобы это было сейчас?

5. Привет, sry, я хотел по-другому