Angular2: Show placeholder image if img src is not valid

后端 未结 8 1764
迷失自我
迷失自我 2020-12-12 12:55

Goal: Load an image with a dynamic source. If no image is found, then load a placeholder image instead.

This should demonstrate what I\'m trying to

8条回答
  •  再見小時候
    2020-12-12 13:27

    I've created a custom component that uses a placeholder image if the image is still not loaded or if an error occurs when loading it:

    img.component.ts:

    import { Component, Input, OnChanges } from '@angular/core';
    
    @Component({
        selector: 'my-img',
        templateUrl: 'img.component.html',
    })
    export class ImgComponent implements OnChanges {
        @Input() 
        public src: string;
        @Input() 
        public default: string;
        @Input() 
        public alt: string;
        public cached = false;
        public loaded = false;
        public error = false;
    
        private lastSrc: string;
    
        constructor() { }
    
        public ngOnChanges() {
            if (this.src !== this.lastSrc) {
                this.lastSrc = this.src;
                this.loaded = false;
                this.error = false;
                this.cached = this.isCached(this.src);
            }
    
            if (!this.src) {
                this.error = true;
            }
        }
    
        public onLoad() {
            this.loaded = true;
        }
    
        public onError() {
            this.error = true;
        }
    
        private isCached(url: string): boolean {
            if (!url) {
                return false;
            }
    
            let image = new Image();
            image.src = url;
            let complete = image.complete;
    
            // console.log('isCached', complete, url);
    
            return complete;
        }
    }
    

    img.component.html:

    
        
        
    
    
    
        
        
    
    

    Then you can use it like:

    
    

    PS: I verify beforehand if the image is cached to avoid the image blinking (normally when a component that has the image inside is re-rendered) between the placeholder and the image (if it is cached, I show the image even before the loaded flag be set to true). You can uncomment the log in the isCached function to see if your images are cached or not.

提交回复
热议问题