2015-08-19 18 views
8

Ich versuche, eine Website, wo die nav-Bar Gegenstände auf der Rolle des Benutzers abhängig zu entwickeln, die angemeldet sindAurelia: wie Sitzungen zu verwalten

Als Patrick Walter auf seinem blog vorgeschlagen, dachte ich. um eine session.js-Datei zu erstellen, in der ich Informationen über den aktuellen Benutzer speichern würde: seinen Benutzernamen und seine Rolle. Ich würde dann diese Datei in nav-bar.js injizieren und einen Filter für die Routen erstellen, auf die der Benutzer keinen Zugriff hat. Alles hat gut funktioniert, bis ich die Schaltfläche zum Aktualisieren angeklickt habe ... Tatsächlich erstellt es ein neues Sitzungsobjekt und ich verliere alle Informationsspeicher im vorherigen.

Ich habe in der docs die Singleton-Methode gesehen, aber ich bin mir nicht sicher, wie man es benutzt. Wenn ich es in meinen Code wie unten einfügen, erhalte ich die Nachricht: aurelia.use.singleton is not a function.

Meine letzte Idee wäre, die Rolle/den Benutzernamen zu verschlüsseln und die Sitzung des Browsers zu verwenden, um die Informationen zu speichern. Aber ich wollte erfahreneren Entwicklern ihre Meinung zu dem Thema geben.

Danke für Ihre Hilfe!

EDIT: Hier ist mein Code für session.js

export class Session { 
    username = ''; 
    role = ''; 
    reset() { 
     console.log('Resetting session'); 
     this.username = ''; 
     this.role = ''; 
    }; 
} 

Und das ist, wie ich es injizieren:

import {Session} from './services/session'; 
@inject(Session) 
export class RoleFilterValueConverter { 
    constructor(session) { 
     console.log('Hello from RoleFilter constructor', session) 
     this.session = session; 
    }; 
    toView(routes, role) { 
     console.log('Hello from view', role, this.session) 
     if (this.session.role == 'Superuser') 
      return routes; 
     return routes.filter(r => { 
      var res = !r.config.role || (r.config.role == this.session.role); 
      return res 
     }); 
    } 
} 

Antwort

5

Im Haupteintrittspunkt (nehmen wir an, es ist index.html) Sie sollte etwas in der Art haben:

<body aurelia-app="path/to/main"> 
    <script src="jspm_packages/system.js"></script> 
    <script src="config.js"></script> 
    <script> 
     System.import('aurelia-bootstrapper'); 
    </script> 
</body> 

Dies importiert die gesamte Aurelia-Umgebung. Wenn es export function configure(aurelia) { ... } erreicht, sollte es eine Instanz des Typs Aurelia übergeben und an den Parameter aurelia gebunden werden. Es sollte Ihr aurelia.use.singleton is not a function. Fehler behoben werden. Danach sollte in Ihrer session.js Datei, wenn Sie @inject(Session) verwenden, dieselbe Instanz übergeben werden, die Sie beim Start deklariert haben.

Ich habe auch ein Singleton-Session-Objekt zum Speichern von Benutzerdaten implementiert und diese Methode gewählt, weil es bequemer ist, auf Abhängigkeitsinjektion zu setzen, anstatt immer eine Methode aufzurufen, um Benutzerdaten von einem Cookie abzurufen.

2

Obwohl Laurentius Antwort nicht schlecht ist, gibt es bessere Möglichkeiten, dies zu handhaben, die Ihrer App keine Komplexität hinzufügen.

Sie müssen dies nicht als Singleton angeben. Diese spezielle Funktion ist mehr für einen Randfall, in dem Sie ein bestimmtes Element dem Container für die Abhängigkeitsinjektion als Singleton vor dem Start bereitstellen möchten.

In der Tat, der Aurelia Dependency Injection Framework behandelt alle Module als Singletons, sofern nicht anders angegeben. So sollte der Code so funktionieren, wie Sie ihn dort geschrieben haben, ohne die configure-Funktion.

Ich habe einen ausführlichen Blog geschrieben, den Sie hier hilfreich finden können: http://davismj.me/blog/aurelia-auth-pt2/