2016-09-08 3 views
0

Wenn der Benutzer zuerst meine Aurelia Web App startet, muss ich localStorage überprüfen, um zu sehen, ob meine App ihren letzten Status wiederherstellen muss. Ist dies der Fall, müssen interne Modellwerte von localStorage festgelegt und die Route wiederhergestellt werden. Wenn nicht, muss nur die Route auf die anfängliche Route ("Spiel" genannt) festgelegt werden. Also dachte ich, ich könnte meinen Router config in app.js wie folgt aufgebaut:Aurelia View-Modell ohne Sicht?

config.map([ 
    { route: '', name: 'launcher', moduleId: 'launcher'}, 
    { route: 'game', name: 'game', moduleId: 'game-view'}, 
    ...... 

Wo das Launcher-Modul wird tun, um diese Initialisierung.

launcher.js (teilweise Pseudo-Code):

import { 
    inject, 
    noView 
} from "aurelia-framework"; 
import { 
    Router 
} from 'aurelia-router'; 

@noView 
@inject(Router) 
export class Launcher { 
    constructor(router) { 
     Get localStorage values, including lastState; 

     if (need to restore the past state) { 
      router.navigateToRoute(lastState); 
     } else { 
      router.navigateToRoute('game'); 
     } 
    } 
} 

Das Problem ist, brauche ich nicht wirklich einen Blick für dieses Modul, aber wenn ich nicht über eine launcher.html Datei haben, Aurelia wirft ein Fehler (obwohl alles in Ordnung ist). Ich dachte, der NoView Decorator würde den Trick machen, aber das tat es nicht.

Gibt es eine Möglichkeit, ein navigierbares Modul ohne Sicht zu haben? Gibt es einen besseren Weg, dies zu tun?

+0

Ich würde keine View-Modell für diese Logik verwenden es keinen Sinn macht. Sie können dies in einem Router-Hook oder sogar in Ihrer App tun. Sie können einen Dienst anrufen, der dies für Sie erledigt. –

+0

@PWKad Ja. Scheint nicht wie ein guter Weg, dies zu tun. Ich habe versucht, router.navigateToRoute in meiner app.js anzurufen, aber es hat nicht funktioniert. Vielleicht habe ich es zur falschen Zeit angerufen. Ich habe keine Router-Haken verwendet. Kannst du auf Infos zu diesen hinweisen? –

+0

@PWKad Ich könnte die Route in der config.map zu ['', 'game'] ändern und dann canActivate zu meinem Spiel-View-Modell hinzufügen. Wenn es keinen gespeicherten Zustand gibt, würde ich nur wahr zurückkehren. Wenn ja, würde ich annehmen, dass ich einen Navigationsbefehl (nach den Dokumenten) zurückgeben würde. Dann ist meine Frage, was ist ein Navigationsbefehl? –

Antwort

1

Sie konnte den Launcher in Ihr app.js injizieren:

import {inject} from 'aurelia-framework'; 
import {launcher} from '[file path to launcher]'; 

@inject(launcher) 
export class App{ 
    constructor(launcher) 
    { 
     this.launcher = launcher; 
     this.launcher.activate(); 
    } 
} 

dann in Launchers Methode zu aktivieren, müssen Sie Ihre Logik:

import {inject} from "aurelia-framework"; 
import {Router} from 'aurelia-router'; 

@inject(Router) 
export class Launcher { 
    constructor(router) { 
     this.router = router; 
    } 

    activate(){ 
     Get localStorage values, including lastState; 

     if (need to restore the past state) { 
      this.router.navigateToRoute(lastState); 
     } 
     else { 
      this.router.navigateToRoute('game'); 
     } 
    }   
} 

wenn das nicht funktioniert, dann ist eine weitere Option, den Stamm zu setzen und dann zu einem bestimmten Zustand zu navigieren, dh

import {inject, Aurelia} from 'aurelia-framework'; 

@inject(Aurelia) 
export class Launcher{ 
    constructor(Aurelia){ 
     this.aurelia = Aurelia; 
    } 

    activate(){ 
     Get localStorage values, including lastState; 

     if (need to restore the past state) { 
     this.aurelia.setRoot([file path of starting page]) 
      .then((aurelia) => { aurelia.root.viewModel.router.navigateToRoute('lastState');}); 
    } 
    else { 
     this.aurelia.setRoot([file path of starting page]) 
      .then((aurelia) => { aurelia.root.viewModel.router.navigateToRoute('game');}); 
      } 
    } 

} 

Stellen Sie nur sicher, dass Ihre Startseite, die die Router-Map enthält, nicht app.js ist, da Sie dann eine zirkuläre Abhängigkeit haben. Sie können eine andere Datei als Startseite festlegen.

+0

Das sieht so aus als würde es funktionieren. Ich werde es ausprobieren. –

0
constructor(router) { 
    this._router = router; 
} 

activate(){ 
    //Get localStorage values, including lastState; 
    if (need to restore the past state) { 
     this._router.navigateToRoute(lastState); 
    } else { 
     this._router.navigateToRoute('game'); 
    } 
} 
+0

Dies ist der Code, den ich bereits in meiner Frage habe. Sagen Sie, dass dies in app.js ist? Wenn ja, habe ich das versucht und es funktioniert nicht. –

+0

Haben Sie versucht, router.navigateToRoute vom Konstruktor in activate() zu verschieben? – Lumdeia

+0

Ja innerhalb von app.js. –

3

Sie können auch das @noView-Attribut verwenden, wenn Sie keine Ansicht wünschen.

Grund Nutzung:

import {noView} from 'aurelia-framework'; 

@noView 
export class MyClass{ 
}