Ember.js - questo.Set () in applicationRoute non funziona
-
21-12-2019 - |
Domanda
Sto cercando di impostare una variabile booleana ogni volta che l'utente è registrato.
App.ApplicationRoute = Ember.Route.extend({
isLoggedIn: false,
init: function() {
if (loggedIn) {
this.set('isLoggedIn', true);
} else {
console.log(error)
this.set('isLoggedIn', false);
}
});
}
});
.
Tuttavia, su this.set()
ottengo:
.Uncaught TypeError: indefinito non è una funzione
Qualche idea?
Ho pensato che il miglior posto per gestire la sessione utente sia nel App.ApplicationRoute
poiché è la radice di tutto.Questo causa un problema?
Aggiornato: Con il feedback qui è il codice corrente / completo.
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);
}
});
}
})
.
Così ho lasciato fuori il mio codice FireBase in precedenza perché non lo pensavo davvero pertinente, ma per il gusto di rintracciare il problema, lo aggiungerò in.
Soluzione
Il motivo ha a che fare con il
this
.
Essere erroneamente impostato nel tuo firebasesimplelogin.La funzione che si utilizza all'interno del costruttore deve essere passata in un riferimento a "questo" del contesto esterno.Il modo più semplice per farlo è cambiando il codice della funzione a questo:
function(error, user) {
if (user) {
console.log(user)
this.set('isLoggedIn', true);
} else {
console.log(error)
this.set('isLoggedIn', false);
}
}.bind(this));
. Altri suggerimenti
Prima cosa è il primo :)
Come affermato al ember.js Documenation : .
Nota: se si esegue l'override init per una classe quadro come Ember.View o Ember.arrayController, Assicurati di chiamare questo._Super () nella Dichiarazione init !Se non lo fai, Ember potrebbe non avere un'opportunità per fare un importante lavoro di installazione e vedrai un comportamento strano nella tua applicazione.
Secondo, la tua variabile loggedIn
non è dichiarata né istantaneata e quindi nulla come il tuo error
ma immagino che tu abbia appena strappato un codice del tuo progetto per giocherellare un rapido esempio, quindi se fai:
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);
}
});
}
});
.
Tutto dovrebbe funzionare come previsto :)