Javascript Aurelia:在路由器';s管道步骤,如何将变量绑定到该路由器?

Javascript Aurelia:在路由器';s管道步骤,如何将变量绑定到该路由器?,javascript,aurelia,Javascript,Aurelia,我想将在授权步骤中找到的用户传递到应用程序类,然后传递到主页模块 以下是我所拥有的: export class App { configureRouter(config, router) { config.addPipelineStep('authorize', AuthorizeStep); config.map([ {route: ['', ':filter'], name: "", moduleId: 'welcome'}

我想将在
授权步骤
中找到的用户传递到
应用程序类
,然后传递到
主页模块

以下是我所拥有的:

export class App {
    configureRouter(config, router) {
        config.addPipelineStep('authorize', AuthorizeStep); 
        config.map([
            {route: ['', ':filter'], name: "", moduleId: 'welcome'}
            {route: 'home', name: "home", moduleId: 'home' auth:true}
        ]);
        this.router = router;
    }
}

class AuthorizeStep {
    run(routingContext, next) {
        if (routingContext.nextInstructions.some(i => i.config.auth)) {
            this.client.get('auth/login')
                .then(response => {
                    this.user = response.content;
                });
        }
        return next();
    }
}

在我的应用程序中,我使用currentUser属性创建了一个名为AuthContext的类。您可以将其注入AuthorizeStep的构造函数中,然后将其注入任何其他需要它的模型中。类似于

import {AuthContext} from './auth-context';

export class App {
    static inject() { return [AuthContext];}

    constructor(authcontext){
        this.authContext = authcontext;
    }

    configureRouter(config, router) {
         config.addPipelineStep('authorize', AuthorizeStep); 
         config.map([
            {route: ['', ':filter'], name: "", moduleId: 'welcome'}
            {route: 'home', name: "home", moduleId: 'home' auth:true}
        ]);
        this.router = router;
    }
}

class AuthorizeStep {
    static inject() { return [AuthContext];}

    constructor(authcontext){
        this.authContext = authcontext;
    }
    run(routingContext, next) {
        if (routingContext.nextInstructions.some(i => i.config.auth)) {
            this.client.get('auth/login')
                .then(response => {
                    this.authcontext.user = response.content;
                });
        }
        return next();
    }
}

我一直在做类似的事情,但我发现在附加viewmodel时,我不能依赖于在其他viewmodel中填充
authcontext
。返回由
get
返回的承诺,然后在
get
的解析范围内返回
next()
,似乎可以解决这个问题,在这个问题解决之前不要继续下一个管道步骤。将其应用于@JamesCarters,我将得到以下(未经测试的)代码:


你能把它连接到子路由器上吗?我收到错误:管道步骤只能添加到根路由器。否。Aurelia有两个路由器类,AppRouter和router。AppRouter扩展了router类,是主要的应用程序路由器。router用于任何子路由器,包括嵌套的子路由器。两者之间的主要区别之一是管道只允许在AppRouter上使用,而不允许在任何子路由器上使用虽然公认的答案确实解决了这个问题,但我相信这是大多数人应该做的。如果您有一条指令依赖于授权,在导航到该指令之前,一定要确保您的授权已完成!
class AuthorizeStep {
    static inject() { return [AuthContext];}

    constructor(authcontext){
        this.authContext = authcontext;
    }
    run(routingContext, next) {
        if (routingContext.nextInstructions.some(i => i.config.auth)) {
            return this.client.get('auth/login')
                .then(response => {
                    this.authcontext.user = response.content;
                    return next();
                });
        }
        else {
            return next();
        }
    }
}