Ember.js – this.set() in ApplicationRoute funktioniert nicht
-
21-12-2019 - |
Frage
Ich versuche, eine boolesche Variable festzulegen, wann immer der Benutzer angemeldet ist.
App.ApplicationRoute = Ember.Route.extend({
isLoggedIn: false,
init: function() {
if (loggedIn) {
this.set('isLoggedIn', true);
} else {
console.log(error)
this.set('isLoggedIn', false);
}
});
}
});
Allerdings weiter this.set()
Ich bekomme:
Nicht erfasster TypeError:undefiniert ist keine Funktion
Irgendwelche Ideen?
Ich dachte mir, dass der beste Ort für die Verwaltung von Benutzersitzungen der ist App.ApplicationRoute
denn es ist die Wurzel von allem.Verursacht dies ein Problem?
AKTUALISIERT:Mit Feedback hier ist der aktuelle/vollständige Code.
App.ApplicationRoute = Ember.Route.extend({
isLoggedIn: false,
init: function() {
this._super();
auth = new FirebaseSimpleLogin(appRef, function(error, user) {
if (user) {
console.log(user)
this.set('isLoggedIn', true);
} else {
console.log(error)
this.set('isLoggedIn', false);
}
});
}
})
Deshalb habe ich meinen Firebase-Code zuvor weggelassen, weil ich ihn nicht wirklich für relevant hielt, aber um das Problem aufzuspüren, füge ich ihn hinzu.
Lösung
Der Grund hat mit dem zu tun
this
in Ihrem Firebasesimplelogin falsch eingestellt sein.Die Funktion, die Sie im Konstruktor verwenden, muss in einer Referenz auf „this“ des äußeren Kontexts übergeben werden.Der einfachste Weg, dies zu tun, besteht darin, den Code der Funktion wie folgt zu ändern:
function(error, user) {
if (user) {
console.log(user)
this.set('isLoggedIn', true);
} else {
console.log(error)
this.set('isLoggedIn', false);
}
}.bind(this));
Andere Tipps
Das wichtigste zuerst :)
Wie am angegeben Ember.js-Dokumentation:
NOTIZ:Wenn Sie init für eine Framework-Klasse wie Ember.View oder Ember.ArrayController überschreiben, Rufen Sie unbedingt this._super() in Ihrer Init-Deklaration auf!Wenn Sie dies nicht tun, hat Ember möglicherweise keine Gelegenheit, wichtige Einrichtungsarbeiten durchzuführen, und Sie werden ein seltsames Verhalten in Ihrer Anwendung feststellen.
Zweitens, Ihr loggedIn
Variable ist weder deklariert noch instanziiert und daher ebenso null wie Ihre error
Aber ich vermute, Sie haben gerade einen Teil des Codes Ihres Projekts herausgerissen, um ein kurzes Beispiel zusammenzustellen. Wenn Sie das also tun:
App.ApplicationRoute = Ember.Route.extend({
isLoggedIn: false,
init: function() {
this._super(); // <-- call `this._super()` here
if (loggedIn) {
this.set('isLoggedIn', true);
} else {
console.log(error)
this.set('isLoggedIn', false);
}
});
}
});
Alles sollte wie erwartet funktionieren :)