File

src/app/loader/loader.component.ts

Metadata

selector zone-loader
styleUrls loader.component.css
templateUrl ./loader.component.html

Constructor

constructor(_ngZone: NgZone)

Methods

processWithinAngularZone
processWithinAngularZone()

Se realiza proceso dentro de la ngZone (en el ctx angular), con lo que en cada bucle al actualizarse
el campo this.progress, se va actualizando en la vista

Returns: void
processOutsideOfAngularZone
processOutsideOfAngularZone()

Se realiza el proceso fuera de la ngZone, con lo que en cada bucle se va actualizando
el campo this.progress pero no se va actualizando en la vista al estar fuera del ctx angular.
Una vez concluido el proceso se vuelve a sincronizar con la ngZone para bindear this.progress
con lo cuál evitamos todos los triggers que están pendientes en la detección de cambios en el dom que Angular2 ejecuta continuamente.

Returns: void
Private _increaseProgress
_increaseProgress(doneCallback: () => void)

método que incrementa this.progress hasta 100 a través de un timeout que la ejecuta recursivamente cada 10 ms=> void} doneCallback

Returns: void

Properties

bufferValue
bufferValue: number
Default value: 0
color
color: string
Default value: primary
mode
mode: string
Default value: determinate
progress
progress: number
Default value: 0
value
value: number
Default value: 0
zona
zona: string
import { Component, NgZone } from '@angular/core';

@Component({
  selector: 'zone-loader',
  templateUrl: './loader.component.html',
  styleUrls: ['./loader.component.css']
})
export class LoaderComponent  {
    progress= 0;
    zona: string;
    color = 'primary';
    mode = 'determinate';
    value = 0;
    bufferValue = 0;

    constructor(private _ngZone: NgZone) {}

    /**
     * Se realiza proceso dentro de la ngZone (en el ctx angular), con lo que en cada bucle al actualizarse
     * el campo this.progress, se va actualizando en la vista
     * @memberOf LoaderComponent
     */
    processWithinAngularZone() {
        this.zona = 'dentro';
        this.progress = 0;
        this._increaseProgress(() => console.log('Dentro hecho!'));
    }

    /**
     * Se realiza el proceso fuera de la ngZone, con lo que en cada bucle se va actualizando
     * el campo this.progress pero no se va actualizando en la vista al estar fuera del ctx angular.
     * Una vez concluido el proceso se vuelve a sincronizar con la ngZone para bindear this.progress
     * con lo cuál evitamos todos los triggers que están pendientes en la detección de cambios en el dom que Angular2 ejecuta continuamente.
     * @memberOf LoaderComponent
     */
    processOutsideOfAngularZone() {
        this.zona = 'fuera';
        this.progress = 0;
        // runOutsideAngular-> sale de la ngZone para ejecutar el proceso, se ejecutará en paralelo al ctx angular
        this._ngZone.runOutsideAngular(() => {
            this._increaseProgress(() => {
                // esta es la callback que se ejecutará cuando termine. En ese caso volvemos a la ngZone
                this._ngZone.run(() => {
                    console.log('Fuera hecho!' );
                });
            } );
        });
    }

   /**
    * método que incrementa this.progress hasta 100 a través de un timeout que la ejecuta recursivamente cada 10 ms
    * @private
    * @param {() => void} doneCallback
    * @memberOf LoaderComponent
    */
    private _increaseProgress(doneCallback: () => void) {
        this.progress += 1;
        console.log(`Progreso actual: ${this.progress}%`);
        if (this.progress < 100) {
            window.setTimeout(() => this._increaseProgress(doneCallback), 10);
        }else {
            doneCallback();
        }
    }
}
<section class='loader'>
    <p>Progreso: {{progress}}%</p>
    <div *ngIf="progress!=0">
        <div *ngIf="progress >= 100; then procesado else procesando">Procesado {{zona}} de ngZone</div>

        <ng-template #procesado>
            <p class='green'>Procesado {{zona}} de ngZone</p>
        </ng-template>

        <ng-template #procesando>
            <p class='red'>Procesando ...<span *ngIf="zona=='dentro'; then dentro else fuera"></span> </p>
            <ng-template #dentro>
                <span> !!!!Se actualiza vista!!!!</span>
            </ng-template>

            <ng-template #fuera>
                !!!!No se actualiza vista!!!!
            </ng-template>
        </ng-template>
    </div>
    <div>
        <md-progress-bar [color]="color" [mode]="mode" [value]="progress" [bufferValue]="bufferValue">
        </md-progress-bar>
    </div>
    <div class="opciones">
        <a md-raised-button (click)="processWithinAngularZone()"><i class="material-icons">open_in_browser</i>Procesar dentro ngZone</a>
        <a md-raised-button (click)="processOutsideOfAngularZone()"><i class="material-icons">open_in_new</i>Procesar fuera ngZone</a>
    </div>
</section>
Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""