Sencha Touch 2, перед фильтром на маршрутизаторе, чтобы проверить состояние auth пользователя
Я разрабатываю приложение Sencha Touch 2 с аутентификацией пользователя.
Я использую маркер для аутентификации.
Логика.
Проверка токена существует в локальном хранилище:
var tokenStore = Ext.getStore('TokenStore'),
token = tokenStore.getAt(0).get('token');
Если есть токен, проверьте, действителен ли он. Я делаю чтение из модели, которая подключена к моему API, который возвращает успех или неудачу - в зависимости от маркера - если он действителен или нет.
TestApp.model.CheckAuthModel.load(1, {
scope: this,
success: function(record) {
// Here, I know the token is valid
},
failure: function() {
console.log('failure');
},
callback: function(record) {
console.log('callback');
console.log();
}
});
А вот маршрутизатор, который обрабатывает логику для представлений:
Ext.define("TestApp.controller.Router", {
extend: "Ext.app.Controller",
config: {
refs: {
HomeView: 'HomeView',
LoginView: 'LoginView',
ProductsView: 'ProductsView',
ProductsViewTwo: 'ProductsViewTwo'
},
routes: {
'': 'home',
'home' : 'home',
'login' : 'login',
'products' : 'products',
'testingtwo' : 'testingtwo'
}
},
home: function () {
console.log('TestApp.controller.Router home function');
var initialItem = Ext.Viewport.getActiveItem(),
comp = this.getHomeView();
if (comp === undefined) comp = Ext.create('TestApp.view.HomeView');
Ext.Viewport.animateActiveItem(comp, {
type: 'slide',
listeners: {
animationend: function() {
initialItem.destroy();
}
}
});
},
login: function () {
var initialItem = Ext.Viewport.getActiveItem(),
comp = this.getLoginView();
if (comp === undefined) comp = Ext.create('TestApp.view.LoginView');
Ext.Viewport.animateActiveItem(comp, {
type: 'slide',
listeners: {
animationend: function() {
initialItem.destroy();
}
}
});
},
products: function () {
var initialItem = Ext.Viewport.getActiveItem(),
comp = this.getProductsView();
if (comp === undefined) comp = Ext.create('TestApp.view.ProductsView');
Ext.Viewport.animateActiveItem(comp, {
type: 'slide',
listeners: {
animationend: function(){
initialItem.destroy();
}
}
});
},
testingtwo: function () {
var initialItem = Ext.Viewport.getActiveItem(),
comp = this.getProductsViewTwo();
if (comp === undefined) comp = Ext.create('TestApp.view.ProductsViewTwo');
Ext.Viewport.animateActiveItem(comp, {
type: 'slide',
listeners: {
animationend: function(){
initialItem.destroy();
}
}
});
},
launch: function() {
console.log('TestApp.controller.Router launch!');
}
});
Теперь, как я могу связать маршрутизатор с check auth model callback?
Я хочу знать состояние auth, когда приложение достигает маршрутизатора.
В других фреймворках MVC я мог бы сделать фильтр before на маршрутизаторе, проверить auth и обработать маршруты соответственно.
Могу ли я сделать это в Sencha Touch 2?
Есть идеи?
2 ответа:
Привет я думаю, что этот раздел в документации именно то, что вам нужно:
Перед : Объект
Обеспечивает отображение функций контроллера для фильтрации функций, которые выполняются перед ними при отправке с маршрута. Они обычно используются для выполнения функций предварительной обработки, таких как аутентификация, перед выполнением определенной функции. Они вызываются только при отправке с маршрута. Пример использование:Ext.define('MyApp.controller.Products', { config: { before: { editProduct: 'authenticate' }, routes: { 'product/edit/:id': 'editProduct' } }, //this is not directly because our before filter is called first editProduct: function() { //... performs the product editing logic }, //this is run before editProduct authenticate: function(action) { MyApp.authenticate({ success: function() { action.resume(); }, failure: function() { Ext.Msg.alert('Not Logged In', "You can't do that, you're not logged in"); } }); } });
Http://docs.sencha.com/touch/2.3.1/#!/API-интерфейс/ВН.приложение.Контроллер-ГПФ-до
Конечно, это все еще зависит от вас, чтобы решить, следует ли вам проверять каждый раз или следует кэшировать результат auth на некоторое время.
Обновлено, чтобы ответить на комментарий ниже Честно говоря, я не уверен, как они собирались объявить, что статический метод аутентифицируется в Sencha (вы могли бы сделать это нормально через Javascript, я думаю, т. е.: прототип).
Но есть и другие лучшие варианты для решения именно этой функции аутентификации:
- просто создайте синглетный класс, который обрабатывает служебные материалы. http://docs.sencha.com/touch/2.3.1/#!/API-интерфейс/ВН.Класс-ГПФ-синглтон
- Если вы действительно хотите использовать MyApp, вы можете объявить в Ext.апп.Приложение (в приложении.в JS). Затем вызовите его из глобального экземпляра MyApp.апп.some_function () . Я бы точно не рекомендовал этот метод, потому что вы меняете приложение.JS, это может привести к проблемам, если вы обновите Sencha touch.
Вы можете реализовать функцию запуска приложения auth check in или функцию init вашего контроллера auth и на основе ответа перенаправить соответствующий url-адрес. Что-то вроде этого:
TestApp.model.CheckAuthModel.load(1, { scope: this, success: function(record) { this.redirectTo("home/"); }, failure: function() { this.redirectTo("login/"); console.log('failure'); }, callback: function(record) { console.log('callback'); console.log(); } });