2016-06-28 8 views
11

Ich bereite mein angular2-Projekt auf und aus vielen Gründen habe ich beschlossen, mit einem Samen zu beginnen. This one.NG2: angular2-webpack-starter - was ist der Zweck von HMR?

Dieser Samen verwendet , aber ich verstehe nicht vollständig, was der Zweck ist.

Am Anfang dachte ich, dass HMR über dynamische laden und Komponente ersetzen, während die Web App läuft.

Aber seit ich meine Augen auf die app.service.ts habe, habe ich mich verlaufen. Hier ist der Code dieses Dienstes:

Ich dachte, dass Service bietet einfach einen Platz zum Speichern von Daten. Dies ist nur ein Beispiel.

Aber diese Zeile hat mich verwirrt: @HmrState() _state = { };. Verwendet dieser Dienst HMR, um Daten zu verwalten, die wir mit this.appState.set('value', value); verwalten können (dies ist von der HomeComponent), wie ein kleines Redux-Geschäft (ohne Aktionen, Dispatcher, Blabla)?

Was ist der Zweck des Dekorators @HmrState() hier?

Danke.

Antwort

19

Als ich einen ersten Blick auf angular2-hmr warf, war ich auch überrascht. Ich dachte, es ist so etwas wie ein heißer Austausch, aber es ist nicht wirklich einer. Zumindest von dem, was ich sehe, wenn ich es benutze.

Es sieht so aus, als ob es die Anwendung unabhängig vom Änderungstyp immer neu lädt. Es kann jedoch den Status der vertauschten Objekte wiederherstellen. Die Absicht von @HmrState() ist, den Zustand der Komponente wiederherzustellen, wenn die Anwendung neu geladen wird.

Werfen wir einen Blick auf ein kleines Beispiel. Wir haben eine Form mit einem Eingang, der (mit ngModel oder formControl) um einige Komponente Eigenschaft gebunden ist:

@Component({ 
    template: ` 
    <input [(ngModel)]="inputValue" /> 
    <button (click)="click()">Click me</button> 
    ` 
}) 
export class MyComponent { 

    public inputValue: string; 

    public click() { 
    console.log(this.inputValue); 
    } 

} 

wir in einem gewissen Wert eingeben, z.B. "test123" und klicken Sie auf die Schaltfläche. Es klappt.

Dann plötzlich erkennen wir: die Protokollbeschreibung fehlt. Also gehen wir zu unseren Code und fügen Sie ihn:

@Component({ 
    template: ` 
    <input [(ngModel)]="inputValue" /> 
    <button (click)="click()">Click me</button> 
    ` 
}) 
export class MyComponent { 

    inputValue: string; 

    public click() { 
    console.log('inputValue:', this.inputValue); 
    } 

} 

Dann Code der Komponente geändert wird, HMR ersetzt es und wir erkennen, dass die inputValue verloren.

Um den Wert während des HMR-Prozesses wiederherzustellen, benötigt angular2-hmr einige Informationen über den Objektstatus, bevor er gelöscht wurde. Hier kommt die @HmrState() ins Spiel: Sie weist auf den Zustand hin, der wiederhergestellt werden soll. Mit anderen Worten: die erste Code-Abschnitte mit HMR machen sollte Folgendes geschehen:

@Component({ 
    template: ` 
    <input [(ngModel)]="state.inputValue" /> 
    <button (click)="click()">Click me</button> 
    ` 
}) 
export class MyComponent { 

    @HmrState() public state = { 
    inputValue: '' 
    } 

    public click() { 
    console.log(this.state.inputValue); 
    } 

} 

Der Staat nun dem HMR-Prozessor bekannt ist, und es kann den Zustand nutzen, um unseren Wert wiederherzustellen. Nun, wenn wir den Komponentencode ändern:

@Component({ 
    template: ` 
    <input [(ngModel)]="state.inputValue" /> 
    <button (click)="click()">Click me</button> 
    ` 
}) 
export class MyComponent { 

    @HmrState() public state = { 
    inputValue: '' 
    } 

    public click() { 
    console.log('inputValue:', this.state.inputValue); 
    } 

} 

es auf magische Weise neu lädt unsere Anwendung und den Wert des Inputvalue bleibt erhalten.