Ember.js — this.set() в ApplicationRoute не работает
-
21-12-2019 - |
Вопрос
Я пытаюсь установить логическую переменную всякий раз, когда пользователь входит в систему.
App.ApplicationRoute = Ember.Route.extend({
isLoggedIn: false,
init: function() {
if (loggedIn) {
this.set('isLoggedIn', true);
} else {
console.log(error)
this.set('isLoggedIn', false);
}
});
}
});
Однако на this.set()
Я получил:
Неперехваченная ошибка типа:неопределенное не является функцией
Есть идеи?
Я решил, что лучшее место для обработки сеанса пользователя — это App.ApplicationRoute
поскольку это корень всего.Это вызывает проблемы?
ОБНОВЛЕНО:С отзывами вот текущий/полный код.
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);
}
});
}
})
Поэтому ранее я исключил свой код Firebase, потому что не считал его актуальным, но ради отслеживания проблемы я добавлю его.
Решение
Причина связана с
this
неправильно установлен в вашем firebasesimplelogin.Функция, которую вы используете внутри конструктора, должна передаваться со ссылкой на this внешнего контекста.Самый простой способ сделать это — изменить код функции на следующий:
function(error, user) {
if (user) {
console.log(user)
this.set('isLoggedIn', true);
} else {
console.log(error)
this.set('isLoggedIn', false);
}
}.bind(this));
Другие советы
Прежде всего :)
Как сказано на Документация Ember.js:
ПРИМЕЧАНИЕ:Если вы переопределите init для класса платформы, такого как Ember.View или Ember.ArrayController, обязательно вызовите this._super() в объявлении инициализации!Если вы этого не сделаете, у Ember может не быть возможности выполнить важную работу по настройке, и вы увидите странное поведение в своем приложении.
Во-вторых, ваш loggedIn
переменная не объявлена и не создана и, следовательно, равна нулю, как и ваша error
но я думаю, вы просто вытащили часть кода своего проекта, чтобы собрать быстрый пример, поэтому, если вы это сделаете:
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);
}
});
}
});
все должно работать так, как ожидалось :)