Angular img加载指令
Angular img loading directive
我正在尝试制定一个简单的指令。加载图像时,img src 将设置为 @Input()
字符串字段。在加载时,图像将被设置为原始 src 值(或者至少是我尝试实现它的方式)。
我在这里使用的是答案:
但这不是一个指令,因此无论我在哪里使用图像都需要进行一些更改。
我的第一次尝试:
正在加载-img.directive.ts:
import { Directive, ElementRef, HostListener, Input } from '@angular/core';
@Directive({
selector: '[tohLoadingImg]'
})
export class LoadingImgDirective {
imgSrc: String;
@Input()
spinnerSrc: String;
constructor(private el: ElementRef) {
this.imgSrc = el.nativeElement.src;
el.nativeElement.src = this.spinnerSrc;
}
@HostListener('load') onLoad() {
this.el.nativeElement.src = this.imgSrc;
}
}
来自:
<img src="{{hero.imgUrl}}" alt="Random first slide">
至:
<img src="{{hero.imgUrl}}" alt="Random first slide" [tohLoadingImg]="'/assets/ring.svg'">
错误:
Can't bind to 'tohLoadingImg' since it isn't a known property of 'img'. (".imgUrl}}" alt="Random first slide">-->
我错过了什么?
感谢@Aravind 的指导。这就是我解决它的方法(通过使用组件而不是指令):
微调器-img.component.ts:
import { Component, OnInit, Input } from '@angular/core';
@Component({
selector: 'toh-spinner-img',
templateUrl: './spinner-img.component.html',
styleUrls: ['./spinner-img.component.scss']
})
export class SpinnerImgComponent implements OnInit {
@Input() imgSrc: String;
@Input() spinnerSrc: String;
@Input() imgContainerClass: String;
loading: boolean = true
onLoad() {
this.loading = false;
}
constructor() { }
ngOnInit() { }
}
微调器-img.component.html:
<div [class]="imgContainerClass">
<img *ngIf="loading" src="{{spinnerSrc}}" alt="loading"/>
<img [hidden]="loading" (load)="onLoad()" src="{{imgSrc}}" alt="Hero Pic"/>
</div>
并在使用中:
<toh-spinner-img [imgSrc]="hero.imgUrl" [spinnerSrc]="'/assets/ring.svg'"></toh-spinner-img>
试试这个
import {
Directive,
Attribute,
Renderer2,
ElementRef,
HostListener } from '@angular/core';
@Directive({
selector: '[uiImageLoader]'
})
export class UiImageLoaderDirective {
constructor(
@Attribute('loader') public loader: string,
@Attribute('onErrorSrc') public onErrorSrc: string,
private renderer: Renderer2,
private el: ElementRef) {
this.renderer.setAttribute(this.el.nativeElement, 'src', this.loader);
}
@HostListener('load') onLoad() {
this.renderer.setAttribute(this.el.nativeElement, 'src', this.el.nativeElement.src);
}
@HostListener('error') onError() {
this.renderer.setAttribute(this.el.nativeElement, 'src', this.onErrorSrc);
}
}
用法
<img
uiImageLoader
onErrorSrc="/assets/images/no-available-800.png"
loader="/assets/images/image-loader.svg"
[src]="post.imagePath" [alt]="post.title">
我正在尝试制定一个简单的指令。加载图像时,img src 将设置为 @Input()
字符串字段。在加载时,图像将被设置为原始 src 值(或者至少是我尝试实现它的方式)。
我在这里使用的是答案:
我的第一次尝试:
正在加载-img.directive.ts:
import { Directive, ElementRef, HostListener, Input } from '@angular/core';
@Directive({
selector: '[tohLoadingImg]'
})
export class LoadingImgDirective {
imgSrc: String;
@Input()
spinnerSrc: String;
constructor(private el: ElementRef) {
this.imgSrc = el.nativeElement.src;
el.nativeElement.src = this.spinnerSrc;
}
@HostListener('load') onLoad() {
this.el.nativeElement.src = this.imgSrc;
}
}
来自:
<img src="{{hero.imgUrl}}" alt="Random first slide">
至:
<img src="{{hero.imgUrl}}" alt="Random first slide" [tohLoadingImg]="'/assets/ring.svg'">
错误:
Can't bind to 'tohLoadingImg' since it isn't a known property of 'img'. (".imgUrl}}" alt="Random first slide">-->
我错过了什么?
感谢@Aravind 的指导。这就是我解决它的方法(通过使用组件而不是指令):
微调器-img.component.ts:
import { Component, OnInit, Input } from '@angular/core';
@Component({
selector: 'toh-spinner-img',
templateUrl: './spinner-img.component.html',
styleUrls: ['./spinner-img.component.scss']
})
export class SpinnerImgComponent implements OnInit {
@Input() imgSrc: String;
@Input() spinnerSrc: String;
@Input() imgContainerClass: String;
loading: boolean = true
onLoad() {
this.loading = false;
}
constructor() { }
ngOnInit() { }
}
微调器-img.component.html:
<div [class]="imgContainerClass">
<img *ngIf="loading" src="{{spinnerSrc}}" alt="loading"/>
<img [hidden]="loading" (load)="onLoad()" src="{{imgSrc}}" alt="Hero Pic"/>
</div>
并在使用中:
<toh-spinner-img [imgSrc]="hero.imgUrl" [spinnerSrc]="'/assets/ring.svg'"></toh-spinner-img>
试试这个
import {
Directive,
Attribute,
Renderer2,
ElementRef,
HostListener } from '@angular/core';
@Directive({
selector: '[uiImageLoader]'
})
export class UiImageLoaderDirective {
constructor(
@Attribute('loader') public loader: string,
@Attribute('onErrorSrc') public onErrorSrc: string,
private renderer: Renderer2,
private el: ElementRef) {
this.renderer.setAttribute(this.el.nativeElement, 'src', this.loader);
}
@HostListener('load') onLoad() {
this.renderer.setAttribute(this.el.nativeElement, 'src', this.el.nativeElement.src);
}
@HostListener('error') onError() {
this.renderer.setAttribute(this.el.nativeElement, 'src', this.onErrorSrc);
}
}
用法
<img
uiImageLoader
onErrorSrc="/assets/images/no-available-800.png"
loader="/assets/images/image-loader.svg"
[src]="post.imagePath" [alt]="post.title">