Je suis nouveau sur Angular et je suis aux prises avec un problème de base. J'ai un module qui essaie d'afficher une superposition (2ème module). La superposition a une fonction show() qui, lorsqu'elle est appelée depuis le parent, ne met pas à jour le code html enfant. S'il est appelé depuis le onInit() de l'enfant, cela fonctionne bien.

Je suppose qu'il me manque quelque chose de simple, mais je ne peux pas le trouver. Pouvez-vous m'aider à comprendre ce qui se passe?

Voici le code : vue parent :

export class SalesComponent {
    constructor(private groupsSelectorOverlayComponent: GroupsSelectorOverlayComponent) {
    }

    onBtnGroupsClick() {
        // this is the problematic call. It changes the child's properties, but the child view is not updated
        this.groupsSelectorOverlayComponent.show(-1);
    }
}

La vue enfant :

@Component({
    ...
})
export class GroupsSelectorOverlayComponent implements OnInit {
    public isOpen: boolean = false;
    public groupsResponseData: GroupsResponseData = null;

    constructor(private stocksService: StocksService) {
        this.isOpen = false;
    }

    ngOnInit(): void {
         // if we call show() from here, the view is updated
    }

    show(parentGroupId: number) {
        this.stocksService.getGroups(parentGroupId).subscribe((response) => {
            // we enter here, the values are updated, but when this is called from the parent, the view is not updated
            this.groupsResponseData = response;
            this.isOpen = true;
        });
    }
}

Le modèle enfant :

    <ul *ngIf="groupsResponseData != null" class="groupPages">
        <li *ngFor="let page of groupsResponseData.groups_info" class="groupPage">
            <div class="title">{{ page.page_name }}</div>

            
        </li>
    </ul>

    

Dans app.module.ts j'ai ceci :

providers: [
    GroupsSelectorOverlayComponent
],
0
Tomov 15 oct. 2020 à 16:20

1 réponse

Meilleure réponse

Dans votre parent, créez un

@ViewChild(GroupsSelectorOverlayComponent)  
   child:GroupsSelectorOverlayComponent 

Ensuite, appelez-le comme ceci:

this.child.show=(-1);

Mais rappelez-vous que vous ne pouvez pas l'appeler tant que toutes les vues n'ont pas été initialisées. Sinon this.child sera indéfini.

N'oublie pas

ChangeDetectorRef.DetectChanges();
1
JWP 15 oct. 2020 à 13:43