У меня есть метод на моем контроллере, который срабатывает при нажатии на сетку в моем приложении.
При щелчке по строке сетки я создаю новый экземпляр виджета окна сведений, беру его модель просмотра и создаю ссылку. После создания этой ссылки я показываю окно:
...
itemClicked: function (item, record, index, event, eOpts){
var detailsWindow = Ext.widget('sessiondetails'),
viewmodel = detailsWindow.getViewModel();
viewmodel.linkTo('sessiondetails', {
reference: 'Registration.model.SessionDetails',
id: record.id
});
detailsWindow.show();
}
...
Класс модели, на который имеется ссылка в вызове метода linkTo, имеет конфигурацию прокси-сервера rest, поэтому, когда linkTo запускается, для данных выполняется запрос GET:
Ext.define('Registration.model.SessionDetails', {
extend: 'Ext.data.Model',
fields: [
...
],
proxy:{
type: 'rest',
url: 'sessions',
reader: {
type: 'json',
rootProperty: 'record'
}
}
});
Все это отлично работает. Я пытаюсь понять, как скрыть или хотя бы замаскировать виджет окна, пока запись не загрузится.
Прямо сейчас появляется окно, есть секунда или две задержки, а затем данные появляются после того, как будет возвращен результат запроса GET.
Я бы предпочел иметь возможность отображать окно замаскированным, а затем демаскировать его после загрузки данных. Я знаю, что могу использовать метод .mask()
после отображения окна:
...
detailsWindow.show();
detailsWindow.mask('Loading...');
Но я не могу понять, как удалить маску после того, как ViewModel завершил загрузку записи.
Как бы я это сделал? Я неправильно подхожу к этому?
Обновление: исправление
Основываясь на втором варианте ответа Роберта Уоткинса, я реорганизовал свой код, чтобы:
- Показать и замаскировать окно сразу
- Загрузить запись прямо из модели
- In the success callback for the load method
- Set the returned data into the ViewModel
- Разоблачить окно
Вот обновленный метод:
itemClicked: function (item, record, index, event, eOpts){
// create the window
var detailsWindow = Ext.widget('sessiondetails');
// Get an instance of the model class
var model = Registration.model.SessionDetails;
// manually load the record
// Note that this would be the same as firing
// Registraton.model.SessionDetails.load(...),
// I just think it reads better this way
model.load(record.id, {
// Make sure you include the `scope: this` config,
// otherwise you won't have access to the
// previously defined `detailswindow` variable
scope: this,
success: function (session){
var viewmodel = detailsWindow.getViewModel();
viewmodel.setData(session.getData());
// Since this callback fires after the data is returned,
// placing the unmask here makes sure the data is loaded first.
detailsWindow.unmask();
}
});
// Show and mask the window
detailsWindow.show();
detailsWindow.mask('Loading...');
}