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 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();
            }
       });