javascript - Anropa barnkomponent inuti slider i Angular
Jag har skapat den här reglaget
Fungerande länk: https://stackblitz.com/edit/angular-ivy-gcgxgh?file=src%2Fapp%2Fapp.component.ts,src%2Fapp%2Fapp.component.html
HTML-komponent :
<div class="slideshow-container">
<ng-container>
<div class="mySlides animated fadeInRight">Slide 1</div>
<div class="mySlides animated fadeInRight">Slide 2</div>
</ng-container>
</div>
<button class="btn ansbtn" (click)="plusSlides(-1)">Previous</button>
<button class="btn ansbtn" (click)="plusSlides(1)">Next</button>
jag måste anropa barnkomponent inuti slider som
<ng-container *ngFor="let o of list; let i=index">
<child-component-1 *ngIf="i==0"> </child-component-1>
<child-component-2 *ngIf="i==1"> </child-component-2>
..
<child-component-n *ngIf="i==n"> </child-component-n>
</ng-container>
Får detta fel vid klick på nästa knapp:
FEL Fel: Kan inte läsa egenskaper av undefined (läser 'className')
Finns det någon lösning för att anropa ett barnkomponent inne i en slider och åtgärda felet, tack
Svar #1
du har denna kod på din stackbitz:
var dots = this.elem.nativeElement.querySelectorAll('.dot');
och det finns inga element med klassen "dot" i dina mallar.
så när du gör detta:
dots[this.slideIndex - 1].className += ' active';
värdet av dots[this.slideIndex - 1] är undefined;
detta ger dig då felet
Kan inte läsa egenskaper av undefined (läser 'className')
För att fixa det är mitt förslag att du aldrig använder en querySelectorAll i någon av din Angular-kod...
Jag kommer att anta att du har en variabel i din faktiska komponent som är någon sorts array som genererar element med denna "dot"-klass. Så när du klickar på knappen bör du manipulera denna array-variabel, och inte göra en förfrågan på mallen efter dess resultat.
Den ideala vinkelflödet är
- ändra data i komponenten
- alla de påverkade mallarna är uppdaterade
förhoppningsvis hjälper detta dig att göra framsteg!
Svar #2
Angular är inte bara javascript. Du bör tänka om kring ditt karusell-användande genom variabler och [class.active]="variable" för att ändra klassen samt mallreferensvariabler och @ViewChildren() för att få nativeElements om det var nödvändigt.
Ansvarsfriskrivning: Det är bara ett ofullständigt (och möjligtvis felaktigt) exempel på att använda variabler i .ts som används i .html gör mer "läsbart" och "vänligt Angular" än att använda en "JavaScript-stil" med document.querySelectorAll och className.replace
Kort sagt, om du har, t.ex. något som
<div #slide class="mySlides animated fadeInRight" [ngClass]="className[0]">
Slide 1
</div>
<div #slide class="mySlides animated fadeInRight" [ngClass]="className[1]">
Slide 2
</div>
Du kan definiera några som
@ViewChildren('slide') slides:QueryList<ElementRef>
className:string[]=[]
selectedIndex:number=0;
Och använd några som
slides.forEach((x,index)=>{
this.className[index]=index==selectedIndex?'block active'
:'none'
})
Att använda en .css som
.active{...}
.none{display:none}
.block{display:block}
