2016-12-17 5 views
2

Ich bin neu in AngularJS. Ich versuche, allen Bildern einen Spinner als Hintergrund zu geben. Da es mehrere Bilder gibt, kann ich keine einzige Variable isLoaded in der ts-Datei verwenden.AngularJS 2 wie auf DOM-Element in TS-Datei zugreifen?

Ich benutze dies in der Vorlage:

<img src="{{document.thumbUrl}}" class="spinner" (load)="loaded()" /> 

Dann in der Funktion loaded() in der TS-Datei, wie kann ich das Element zugreifen, die das Ereignis ausgelöst hat? Und wie kann ich die Klasse spinner für das bestimmte Element entfernen, das das Ereignis ausgelöst hat?

+0

ist diese Frage über Angular.js oder Angular2? Es ist nicht wirklich klar, außer dass Sie TypeScript erwähnen, das normalerweise nicht mit Angular.js verwendet wird. – Claies

+1

@Claies, ich denke du bist absichtlich dumm, mit allem Respekt! Es ist mehr als klar, dass dies Angular 2 ist und nebenbei Angular zu AngularJS2 ist. – Milad

+0

Angular.js und Angular 2 sind ** völlig unterschiedliche Rahmen **. Sie haben beide markiert, aber Ihre Frage trifft eindeutig nicht auf beide zu. – Claies

Antwort

2
<img src="{{document.thumbUrl}}" class="spinner" (load)="loaded($event)" /> 

in Ihrer Klasse

constructor(private renderer:Renderer){ 


} 

loaded($event){ 

    console.log($event.target); // is the img 
    this.renderer.setElementClass($event.target, '', false); 
} 

Und vielleicht ein bisschen schlauer:

<img #image src="{{document.thumbUrl}}" [class.spinner]="!image.loaded" (load)="image.loaded='true'" /> 
1

Nach Richtlinien Lernen ich es getan habe, wie folgt:

import {Directive, ElementRef, Input, HostListener, Renderer} from '@angular/core'; 

@Directive({selector: '[myLoading]'}) 
export class ImageLoadingDirective 
{ 
    constructor(private el: ElementRef, 
       private renderer: Renderer) 
    { 
    } 

    @HostListener('load') onLoad() 
    { 
     this.renderer.setElementClass(this.el.nativeElement, 'loading', false); 
    } 

    @HostListener('error') onError() 
    { 
     this.renderer.setElementClass(this.el.nativeElement, 'errLoading', false); 
    } 
} 

Dazu einfach hinzufügen myLoading als Attribut e zu jedem Bild. Natürlich sollten Sie die Klassen loading und error in CSS definieren, und Sie sollten diese Anweisung auch in den Moduldeklarationsabschnitt aufnehmen.

Sorry, dieses "Framework" saugt in vielerlei Hinsicht. Anders als die typisierte Sprache und die reaktive Programmierung sehe ich darin keinen Vorteil.

PS. Was ich nicht verstanden habe ist, dass die Funktionsnamen onLoad und onError scheinbar willkürlich sind. Ich habe sie nirgendwo angerufen, und ich kann für sie irgendwelche Namen wählen, aber sie funktionieren immer noch. Keine Ahnung, worauf es ankommt.

+0

Die Namen sind in der Tat willkürlich. Angular2 macht es auch sehr schmerzhaft, wenn Sie Ihren Code in wiederverwendbare Teile umwandeln, was der Kernpunkt der komponentenorientierten Programmierung sein soll. In Bezug auf eine typisierte Sprache ist die Verwendung von TypeScript mit ausgezeichneten Fähigkeiten sehr schlecht. Sie neigen dazu, Typen wie ein Laufzeitkonstrukt zu behandeln, was nur für Klassen funktioniert, und nur so, weil sie zur Laufzeit immer noch Werte und keine Typen sind, und die meisten APIs nehmen 'any' zurück und geben sie zurück. Kurz gesagt, ich denke, Ihre Frustration ist gerechtfertigt. –

Verwandte Themen