Ember.js - isso.set() no ApplicationRoute não trabalhar
-
21-12-2019 - |
Pergunta
Eu estou tentando definir uma variável booleana sempre que o usuário está conectado.
App.ApplicationRoute = Ember.Route.extend({
isLoggedIn: false,
init: function() {
if (loggedIn) {
this.set('isLoggedIn', true);
} else {
console.log(error)
this.set('isLoggedIn', false);
}
});
}
});
No entanto, no this.set()
Eu recebo:
Não Identificada TypeError:indefinido não é uma função
Qualquer idéias?
Eu percebi que o melhor lugar para lidar com a sessão do usuário está no App.ApplicationRoute
desde a sua raiz de tudo.Isso causa um problema?
ATUALIZADO:Com os comentários aqui é o actual código 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);
}
});
}
})
Então eu deixei de fora o meu Firebase código anteriormente, porque eu não acho mesmo que relevantes, mas por causa de acompanhar o problema, eu vou adicioná-lo.
Solução
A razão tem a ver com o
this
sendo erroneamente definido no seu firebasesimplelogin.A função que você está usando dentro do construtor deve ser passado em uma referência a 'este' do exterior contexto.A maneira mais fácil de fazer isso é alterar o código da função a este:
function(error, user) {
if (user) {
console.log(user)
this.set('isLoggedIn', true);
} else {
console.log(error)
this.set('isLoggedIn', false);
}
}.bind(this));
Outras dicas
Primeira coisa primeira :)
Como indicado no Ember.js documenation:
NOTA:Se você substituir init para uma estrutura de classe como Brasa.Exibir ou Brasa.ArrayController, certifique-se de chamar a esta._super() na sua declaração de init!Se não, Um não pode ter uma oportunidade para fazer o importante trabalho de configuração, e você verá um comportamento estranho em seu aplicativo.
Segundo, o seu loggedIn
variável não é declarada, nem instanciado e, portanto, nulo, bem como o seu error
mas eu acho que você só rasgou algum código do seu projeto para violino em conjunto um exemplo rápido, por isso, se você fizer:
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);
}
});
}
});
tudo deve funcionar como o esperado :)