Aurelia视图模型没有视图?

时间:2016-09-08 23:57:40

标签: aurelia aurelia-router

当用户首次启动我的Aurelia网络应用时,我需要检查localStorage以查看我的应用是否需要恢复其上一个状态。如果是,则需要从localStorage设置内部模型值并恢复路由。如果没有,它只需要设置到初始路线的路线(称为“游戏”)。所以我想我可以在app.js中设置我的路由器配置,如下所示:

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

启动器模块将执行此初始化。

launcher.js(部分伪代码):

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');
        }
    }
}

问题是,我真的不需要这个模块的视图,但如果我没有launcher.html文件,Aurelia会抛出错误(即使一切正常)。我认为noView装饰器可以解决这个问题,但事实并非如此。

有没有办法让没有视图的导航模块?有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

如果您不想要视图,也可以使用@noView属性。

基本用法:

<a-entity meshline="lineWidth: 20; path: 37.32299  -122.04185 0, 37.32298  -122.03224</a-entity>

答案 1 :(得分:1)

你可以将Launcher注入你的app.js:

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();
    }
}

然后在你的启动器激活方法中,有你的逻辑:

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');
         }
    }        
}

如果这不起作用,那么另一个选择是设置根然后导航到某个状态,即

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');}); 
          }
     }

}

只需确保您的起始页面(具有路由器地图)不是app.js,因为这样您就会有循环依赖。您可以将另一个文件作为起始页面。

答案 2 :(得分: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');
    }
}