2016-07-22 11 views
5

Tôi muốn hiển thị một spinner hình nền/tải bên trong một div đó sẽ được tải một hình ảnh bên trong của nó, hình ảnh sẽ hiển thị khi nó đã được nạp đầy đủ làm một cái gì đó như thế này:Hiển thị một biểu tượng tải trong khi hình ảnh tải

<div style="background-image:url('imageThatWillAppearBeforeLoad')"></div> 

Demo (In jQuery)

Làm cách nào tôi có thể sử dụng cùng Angular2/Ionic2?

+0

có thể trùng lặp của [Ionic 2: (Lazy) Loading spinner cho hình ảnh] (http://stackoverflow.com/ câu hỏi/38846271/ionic-2-lazy-loading-spinner-for-pictures) –

Trả lời

12

Tạo thành phần hiển thị hình ảnh trình giữ chỗ cho đến khi hình ảnh được yêu cầu được tải và ẩn hình ảnh được yêu cầu. Khi hình ảnh được tải, bạn ẩn trình giữ chỗ và hiển thị hình ảnh.

@Component({ 
    selector: 'image-loader', 
    template: `<img *ngIf="!loaded" src="url-to-your-placeholder"/> 
    <img [hidden]="!loaded" (load)="loaded = true" [src]="src"/>` 
}) 
export class ImageLoader { 
    @Input() src; 
} 

Xem nó hoạt động trong Plunker.

Cập nhật

Bây giờ tôi hiểu các yêu cầu tốt hơn, đây là một giải pháp với hình nền. Đó là một chút hacky, và tôi thích một bản gốc tốt hơn ...

@Directive({ 
    selector: '[imageLoader]' 
}) 
export class ImageLoader { 
    @Input() imageLoader; 

    constructor(private el:ElementRef) { 
    this.el = el.nativeElement; 
    this.el.style.backgroundImage = "url(http://smallenvelop.com/demo/image-loading/spinner.gif)"; 
    } 

    ngOnInit() { 
    let image = new Image(); 
    image.addEventListener('load',() => { 
     this.el.style.backgroundImage = `url(${this.imageLoader})`; 
    }); 
    image.src = this.imageLoader; 
    } 
} 

Updated plunker.

+0

Mã của bạn hoạt động tốt, nhưng đối với trường hợp của tôi như tôi đã đăng, tôi có một '

' có chứa hình ảnh ở chế độ nền, tôi đã cố gắng để tinh chỉnh mã của bạn để phù hợp với 'div' tôi có nhưng nó đã không làm việc, nó có thể làm cho nó hoạt động như một 'div'? –

+0

Đối với những gì tôi đã đạt được cho đến nay tôi đoán rằng (tải) không hoạt động vì một lý do nào đó! Bởi vì tôi đã thay thế 'img' bằng' div', vv ... khi tôi kiểm tra 'DOM', tôi thấy ẩn có nghĩa là load = true không được áp dụng vì một lý do nào đó, điều khiến tôi thậm chí còn chắc chắn rằng có một vấn đề với '(load)' là tôi thay thế nó bằng '(click)' sau đó tôi đặt nó vào phần giữ chỗ 'div' và nó đã hoạt động! Vì vậy, bạn có bất kỳ ý tưởng tại sao '(tải)' không hoạt động? –

+0

Nó không hoạt động vì 'div' không có sự kiện 'onload' ... Đây là lý do tại sao tôi tạo thành phần theo cách đó. – yarons

3

Dưới đây là một bản sao của một trong tôi posts

cuối cùng tôi giải quyết vấn đề đó với CSS! Khi một hình ảnh đang tải trong ionic 2, thẻ ion-img không có bất kỳ lớp nào. Tuy nhiên, khi hình ảnh cuối cùng được nạp, thẻ ion-img có được lớp "img-loaded".

Đây là giải pháp của tôi:

<ion-img [src]="img.src"></ion-img> 
    <ion-spinner></ion-spinner> 

Và CSS của tôi:

.img-loaded + ion-spinner { 
    display:none; 
} 
Các vấn đề liên quan