Sencha Touch загружается из магазина после входа в систему - проблема с гонкой?

Я намерен загружать данные с сервера только после аутентификации пользователя. Для простоты предположим, что пользователь уже аутентифицирован.

Я поместил вызов функции загрузки данных (которая загружает данные из хранилища) в функцию инициализации Main.js, как вы можете видеть ниже.

Однако функция getStore('storeId').load() является асинхронной, что заставляет меня беспокоиться о том, что хранилище данных завершает загрузку только после завершения загрузки главного представления, что может заставить представление загружаться без данных (исправьте меня, если я ошибаюсь, возможно, сенча может справиться с этим, представление имеет ссылку на storeId).

Как лучше всего решать такие проблемы?

Тривиальное решение: вызов загрузки хранилища синхронно, но имеет ли это какое-то значение? и на всякий случай, как это сделать? Я попытался добавить синхронную переменную со значением true, но не работает.

app.js

launch: function() {

    // Destroy the #appLoadingIndicator element
    Ext.fly('appLoadingIndicator').destroy();

    Ext.Ajax.request({
        url: MyApp.app.baseUrl + 'session/mobileCheckAuth',
        method: "POST",
        useDefaultXhrHeader: false,
        withCredentials: true,
        success: function(response, opts) {
            if (response && response.status === 200) {
                Ext.Viewport.add(Ext.create('MyApp.view.Main'));
            } else {
                Ext.Viewport.add(Ext.create('MyApp.view.LoginPanel'));
            }
        },
        failure: function(response, opts) {
            alert('Unexpected failure detected');
            Ext.Viewport.add(Ext.create('MyApp.view.LoginPanel'));
        }
    });

},

Main.js

Ext.define('MyApp.view.Main', {
...
initialize: function() {
    console.log('main.initialize');

    this.callParent(arguments);

    // Load app data
    MyApp.utils.Functions.loadData();
}

person user2867106    schedule 14.07.2014    source источник


Ответы (1)


Есть два способа решить эту проблему:

  1. Если ваше представление состоит из сетки, состояния гонки не будет. Если сетка отображается до того, как магазин завершит загрузку, сетка обновится с добавлением новых данных. Чтобы это работало, вы должны объявить магазин как 'store: "mystore";' .

  2. Если у вас есть сложное представление, которое напрямую не связано с хранилищем, вы должны сначала загрузить хранилище, а в событии загрузки хранилища вы инициализируете рендеринг представления.

    store.load({callback: function(){
        Ext.Viewport.add(Ext.create('MyApp.view.Main'}
    });
    
person Lorenz Meyer    schedule 14.07.2014
comment
Я думаю, что получил ответ, но просто чтобы убедиться: у меня есть класс, который расширяет «Ext.List» и в конфиге есть store: «mystore», это относится к первому варианту? что вы имеете в виду под сеткой? и где задокументирована эта автосинхронизация между просмотром и хранилищем? - person user2867106; 15.07.2014
comment
@user2867106. Ваши вопросы по одному: 1: Да. 2: Ext.grid.Grid 3: это привязка данных, а не автосинхронизация (autoSync является свойством хранилища и относится к синхронизации изменений с внутренним сервером). Привязка данных — это базовая концепция MVC. Я не могу дать ссылку на его документацию, но любой пример с оперативными изменениями данных отражает это базовое поведение. - person Lorenz Meyer; 15.07.2014