Aurelia:在路由器的管道步骤中,如何将变量绑定到该路由器?

Moo*_*ose 6 javascript aurelia aurelia-navigation aurelia-router aurelia-binding

我想传递用户,在发现AuthorizeStep要么对App class,然后到home module.

这就是我所拥有的:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 7

在我的应用程序中,我创建了一个名为AuthContext的类,其中包含currentUser属性.您可以将其注入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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 没有."Aurelia有两个路由器类,AppRouter和路由器.AppRouter扩展了Router类,是主要的应用路由器.Router用于任何子路由器,包括嵌套子路由器.两者之间的主要区别之一是管道只允许在AppRouter而不是任何子路由器上." http://aurelia.io/hub.html#/doc/article/aurelia/router/latest/router-configuration/8 (2认同)

dev*_*vid 6

我一直在做类似的事情,但我发现我不能依赖在authcontext附加视图模型时在其他视图模型中填充。返回由 the 返回的承诺get,然后next()在 the 的分辨率内返回get似乎解决了这个问题,这个想法是在解决这个问题之前不要进行下一个管道步骤。将其应用于@JamesCarters的答案,我会得到以下(未经测试的)代码:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)