ExtJS 5, синхронная загрузка ресурсов
В моем приложении тексты выводятся в зависимости от языка пользователя, а на сервере хранятся в БД и изредка меняются. Поэтому я не могу просто прописать их в js файлах. Как выход, я создал синглтон который запрашивает тексты с сервера при создании.
Ext.define("Communication.config.LocalText",{
singleton : true,
constructor : function(config){
console.log("constructor : Communication.config.LocalText");
this.store = Ext.create("Ext.data.Store", {
model: "Communication.model.LocalText",
proxy: {
type: "ajax",
url : "/json?cmd=communication.translations",
pageParam: "",
startParam: "",
limitParam: ""
}
});
this.store.load();
}
});
Предполагалось что я буду подключать его к тем вьюхам где нужны тексты, таким вот образом:
Ext.define("Communication.view.TabMenu", {
extend: "Ext.tab.Panel",
alias: "widget.tabmenu",
requires: [
"Communication.config.LocalText"
],
initComponent: function() {
Ext.apply(this, {
items: [
{
title: Communication.config.LocalText.getText("heading", "history")
}
]
});
this.callParent(arguments);
}
});
Но возникла проблема: загрузка то асинхронная. Так что, когда я обращаюсь к этому синглтону и вызываю getText(), часто бывает что текстов еще нет. Я пытался сделать цикл после load для ожидания, но тут уже браузер возмущается что скрипт не отвечает. Подскажите пожалуйста, как бы вы решили эту проблему? |
Генерим на сервере такой класс например:
Ext.define("MyApp.Locale", {
singleton : true,
get : function (id) { return this.phrases[id]; },
phrases : {
'yes' : 'Да',
'no' : 'Нет',
...
}
});
То есть вместо статического MyApp.Locale.js на сервере выполняется скрипт который наполняет его действующими локалями.На PHP например как-то так:
Ext.define("MyApp.Locale", {
singleton : true,
get : function (id) { return this.phrases[id]; },
phrases : <? json_encode($active_locale_translations) ?>
});
|
Да, такая мысль была. Но проблема в том, что у меня ВСЕ генерируемые сервером файлы доступны по такому вот урлу: "/controller?cmd=...". А экст ищет свои ресурсы по другим путям. В частности, этот файл локали будет искаться по пути MyApp/app/Locale.js. Вот если бы можно было для отдельного файла заменить путь... Или можно?
|
В общем, проблему решил определив этот источник текстов в index.htm, благо он как раз на сервере генерится. Костыль конечно, но пока пусть поработает, может потом лучше придумаю.
|
на сервере можно урлы красивые рисовать средствами вебсервера ..mode_rewrite например для апача
|
Цитата:
|
Цитата:
Ну ок ..если это один файл, можно делать так: <script src="MyApp/Locale.js"></script>..или так:
Ext.Loader.loadScript({
url : 'MyApp/Locale.js',
onLoad : function() {
...
}
});
|
Собирать будем 100%. Ну а ресурсы инициализирую в индексе, он то генерится на сервере. Пусть уж так...
|
Я делаю вот так:
var loadMask;
var verifyStoreLoads = function(){
var ret = true;
var filStore = controller.getFilialsStore();
ret = ret&&filStore.isLoadedSuccessful;
var divStore = controller.getDivisionsStore();
ret = ret&&divStore.isLoadedSuccessful;
return ret;
}
var preRun = function(){
if (!loadMask){
loadMask = new Ext.LoadMask(globaldatapanel, {msg:'Загрузка справочников...'});
loadMask.show();
}
var ret = verifyStoreLoads();
if (ret){
loadMask.hide()
loadMask.destroy();
run();
}
else
setTimeout(preRun,1000);
}
ну а в сторе вешаю слушатель
isLoaded:false,
isLoadedSuccessful:false,
listeners:{
load: function(store, records, successful, eOpts){
store.isLoaded = true;
store.isLoadedSuccessful = successful;
}
},
В итоге, пока сторы не загружены, висит сообщение "Загрузка справочников..." |
| Часовой пояс GMT +3, время: 04:04. |