#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, я хотел по-другому