2016-10-04 10 views
0

Ich habe meine Komponente Vorlage HTML geändert, aber die Änderungen wurden nicht in meiner App widergespiegelt. Gibt es eine Möglichkeit, die App zu zwingen, alle ihre Komponenten und Vorlagen zu aktualisieren?angular2 aktualisieren Komponente Vorlage

Nachdem sah sich die meisten Menschen

ApplicationRef.tick() verwenden sagen - zu Angular ähnlich 1en $rootScope.$digest() - dh überprüfen Sie die vollständige Komponentenbaum

NgZone.run(callback) - ähnlich wie $rootScope.$apply(callback) - dh bewerten innerhalb der Callback-Funktion die Angular 2-Zone. Ich denke, aber ich bin mir nicht sicher, dass das den gesamten Komponentenbaum nach dem Ausführen der Callback-Funktion überprüft.

ChangeDetectorRef.detectChanges() - ähnlich wie $scope.$digest() - das heißt, überprüfen Sie diese Komponente nur und seine Kinder

Aber sie alle zu sein scheinen, wenn Sie eine Variable ändern und die Komponente aktualisieren müssen. Alles, was ich getan habe, ist etwas HTML zu ändern und den geänderten HTML-Code neu zu rendern, aber es scheint im Cache gespeichert zu sein.

habe ich versucht, die ChangeDetectorRef wie folgt, aber es scheint nichts zu tun:

import { Component, OnInit, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'; 
import { Router } from '@angular/router'; 

import { Hero } from '../classes/hero'; 
import { HeroService } from '../services/hero.service'; 

@Component({ 
    selector: 'my-dashboard', 
    templateUrl: '/app/templates/dashboard.component.template.html', // I just want to refresh some changes I made in this file 
    changeDetection: ChangeDetectionStrategy.OnPush // I have tried with and without this - doesn't seem to do anything for me 
}) 

export class DashboardComponent implements OnInit { 
    heroes: Hero[] = []; 

    constructor(
     private ref: ChangeDetectorRef, 
     private router: Router, 
     private heroService: HeroService 
    ) { 
     this.ref.markForCheck(); // make it check for changes 
    } 

    public ngOnInit(): void { 
     this.getHeroes(); 
    } 

    public gotoDetail(hero: Hero): void { 
     let link = ['/detail', hero.id]; 
     this.router.navigate(link); 
    } 

    private getHeroes(): void { 
     console.log('sdklfn;') 
     this.heroService.getHeroes() 
      .then(heroes => this.heroes = heroes.slice(1, 5)); 
    } 
} 

Oder gibt es einen Ordner von Dateien kann ich nur eine Aktualisierung erzwingen löschen zu?

+0

Wie hast du das machen Änderungen an der Vorlage Sie können die Vorlage einer instanziierten Komponente nicht ändern. Sie können möglicherweise dynamisch eine neue Komponenteninstanz erstellen, die die neue Vorlage verwendet. –

+0

es ist nur eine HTML-Datei, also habe ich es gerade bearbeitet, während ich die Anweisungen in [Tutorial] (https://angular.io/docs/ts/latest/tutorial/toh-pt5.html) befolge - es sagt nie alles über das Caching und wie man die Vorlage aktualisiert, um die Änderungen anzuzeigen! Die Komponente sollte instanziiert werden, da ich zur URL blättern kann und die alte Vorlage sehen kann. – Pete

+0

Angular kompiliert die Vorlage, wenn sie eine neue Komponente erstellt und nur die kompilierte Ausgabe verwendet und es überhaupt nicht interessiert, was Sie mit der ursprünglichen Vorlage machen später. IMHO passt dieser Ansatz überhaupt nicht zu Angular2. Ich würde vorschlagen, dass Sie die Tutorials unter http://angular.io durcharbeiten, bevor Sie versuchen, Ansätze anzuwenden, die Sie von Angular1 gewohnt sind. Angular2 und Angular1 haben nicht viel gemeinsam. –

Antwort

1

Ok, ich habe mein Problem behoben, indem ich einen Laufzeitcompiler hinzugefügt habe, um den Cache manuell zu löschen - es scheint dumm, dies programmatisch zu tun (anstatt nur einige Dateien löschen zu können). Aber ich werde diese offen für den Fall, lassen jemand eine bessere Lösung

import { Component, OnInit } from '@angular/core'; 
import { Router } from '@angular/router'; 
import { RuntimeCompiler} from '@angular/compiler'; // add this 

import { Hero } from '../classes/hero'; 
import { HeroService } from '../services/hero.service'; 

@Component({ 
    selector: 'my-dashboard', 
    templateUrl: '/app/templates/dashboard.component.template.html', // I just want to refresh some changes I made in this file 
}) 

export class DashboardComponent implements OnInit { 
    heroes: Hero[] = []; 

    constructor(
     private runtimeCompiler: RuntimeCompiler, // add this 
     private router: Router, 
     private heroService: HeroService 
    ) { 
     this.runtimeCompiler.clearCache(); // add this 
    } 

    public ngOnInit(): void { 
     this.getHeroes(); 
    } 

    public gotoDetail(hero: Hero): void { 
     let link = ['/detail', hero.id]; 
     this.router.navigate(link); 
    } 

    public getHeroes(): void { 
     this.heroService.getHeroes() 
      .then(heroes => this.heroes = heroes.slice(1, 5)); 
    } 
} 

Ich habe auch nur kommen über diese Frage findet, die mehr Variationen hat, wie die Template-Cache löschen: How to clear template cache