fix(ivy): handle elements with local refs in i18n blocks (#33415)
Prior to this commit, i18n logic which ensures that elements removed in a translation are also removed in DOM, didn't take into account the fact that elements may have local refs. As a result, remove operation failed, since there is no corresponding tNode found. This commit updates the logic to skip all local refs while going though the list of nodes to ensure that DOM matches elements present in translation. PR Close #33415
This commit is contained in:
@ -683,10 +683,21 @@ function i18nEndFirstPass(lView: LView, tView: TView) {
|
||||
const visitedNodes = readCreateOpCodes(rootIndex, tI18n.create, lView);
|
||||
|
||||
// Remove deleted nodes
|
||||
for (let i = rootIndex + 1; i <= lastCreatedNode.index - HEADER_OFFSET; i++) {
|
||||
if (visitedNodes.indexOf(i) === -1) {
|
||||
removeNode(i, lView, /* markAsDetached */ true);
|
||||
let index = rootIndex + 1;
|
||||
while (index <= lastCreatedNode.index - HEADER_OFFSET) {
|
||||
if (visitedNodes.indexOf(index) === -1) {
|
||||
removeNode(index, lView, /* markAsDetached */ true);
|
||||
}
|
||||
// Check if an element has any local refs and skip them
|
||||
const tNode = getTNode(index, lView);
|
||||
if (tNode && (tNode.type === TNodeType.Element || tNode.type === TNodeType.ElementContainer) &&
|
||||
tNode.localNames !== null) {
|
||||
// Divide by 2 to get the number of local refs,
|
||||
// since they are stored as an array that also includes directive indexes,
|
||||
// i.e. ["localRef", directiveIndex, ...]
|
||||
index += tNode.localNames.length >> 1;
|
||||
}
|
||||
index++;
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user