#angular #angular-changedetection
Вопрос:
У меня проблема с обнаружением изменений углового 11 в этом случае:
У меня есть карта, и я повторяю ее в шаблоне, используя канал значений ключей и дополнительный обратный вызов, чтобы получить исходный порядок карты, а не порядок по ключу.
Но когда я изменяю эту карту, обнаружение изменений ничего не делает.
Я знаю, что канал значений ключей генерирует полный новый массив. Таким образом, ясно, что изменение ссылок на карте не приведет к обнаружению изменений. Но почему бы не изменить полную карту?
Вот какой-то код:
Шаблон:
<ng-container *ngFor="let postMap of mappingMap.events | keyvalue: originalOrder; let i = index">
<ion-slide *ngIf="!postMap.value.isHiddenByFilter" (click)="showSlideActionSheet('events', postMap.key)" class="overview-slide" >
Компонент:
interface MappingMapvalue {
isHiddenByFilter: boolean;
sliderIndex: number;
}
mappingMap: Map<number, MappingMapvalue>;
pseudyfunction(cpt: string): void {
let newMap: any;
posts: ....................
newMap = [...this.mappingMap[cpt].entries()].sort((a, b) =>
posts[a[0]][key].toLowerCase() > posts[b[0]][key].toLowerCase()
? 1
: posts[b[0]][key].toLowerCase() > posts[a[0]][key].toLowerCase() ? -1 : 0
);
this.mappingMap[cpt] = new Map(newMap); // Why no change detection here? This is a complete new Map! Same properties but another order
}
originalOrder = (a: KeyValue<number,MappingMapvalue>, b: KeyValue<number,MappingMapvalue>): number => 0;
Кто-нибудь может объяснить, почему обнаружение изменений не срабатывает при инициализации новой карты?
Срабатывает обнаружение изменений, если я это сделаю:
const newMap2 = new Map();
newMap2.set(700, {isHiddenByFilter: true, sliderIndex: 0});
this.mappingMap[cpt] = newMap2;
Но почему тогда, а не при изменении всей карты?
Дополнительный вопрос::
Это не приводит к обнаружению изменений:
this.mappingMap[cpt] = new Map(newMap);
this.mappingMap[cpt].set('newdummyfield', {isHiddenByFilter: true, sliderIndex: undefined});
this.mappingMap[cpt].delete('newdummyfield');
Но это вызывает его:
(В сценарии это не имеет смысла, но я хотел это проверить)
this.mappingMap[cpt] = new Map(newMap);
this.mappingMap[cpt].set('newdummyfield', {isHiddenByFilter: true, sliderIndex: undefined});
setTimeout(() => {
this.mappingMap[cpt].delete('newdummyfield');
});
Ожидает ли обнаружение изменений полного синхронного кода? Является ли это обычным поведением обнаружения изменений?
Комментарии:
1. У вас есть OnPush? вы пробовали с
markForCheck()
? Я бы не стал полагаться на эти методы для вызова обнаружения изменений.2. Обнаружение изменений не выполняется при использовании канала, если только значение, которое должно быть передано по каналу, не изменилось. Таким образом, если
mappingMap.events
не произойдет изменений, обнаружение изменений не будет выполняться.3. @Убирайся с моей лужайки, Как вы можете видеть в моем вопросе выше, я задал именно этот вопрос: «Кто-нибудь может объяснить, почему обнаружение изменений не срабатывает, когда карта инициализируется новой?» Это совершенно новая карта, на которой ничего не срабатывает
4. @Bojan Kogoj Я не использую OnPush и не пробовал markForCheck. Но я думаю, что обнаружение изменений должно выполняться, если я создам mappingMap.events совершенно новым с помощью новой карты().
5. Не имеет значения, что это новая карта. Ваша труба включена
events
, поэтому, еслиevents
не будут внесены изменения, обнаружение не будет инициировано.