Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 06.06.2014, 18:15
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

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 для ожидания, но тут уже браузер возмущается что скрипт не отвечает. Подскажите пожалуйста, как бы вы решили эту проблему?
Ответить с цитированием
  #2 (permalink)  
Старый 07.06.2014, 07:36
Профессор
Отправить личное сообщение для siber-biber Посмотреть профиль Найти все сообщения от siber-biber
 
Регистрация: 07.08.2013
Сообщений: 214

Генерим на сервере такой класс например:
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) ?>
});
Ответить с цитированием
  #3 (permalink)  
Старый 09.06.2014, 11:02
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

Да, такая мысль была. Но проблема в том, что у меня ВСЕ генерируемые сервером файлы доступны по такому вот урлу: "/controller?cmd=...". А экст ищет свои ресурсы по другим путям. В частности, этот файл локали будет искаться по пути MyApp/app/Locale.js. Вот если бы можно было для отдельного файла заменить путь... Или можно?
Ответить с цитированием
  #4 (permalink)  
Старый 09.06.2014, 12:23
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

В общем, проблему решил определив этот источник текстов в index.htm, благо он как раз на сервере генерится. Костыль конечно, но пока пусть поработает, может потом лучше придумаю.
Ответить с цитированием
  #5 (permalink)  
Старый 09.06.2014, 13:18
Профессор
Отправить личное сообщение для siber-biber Посмотреть профиль Найти все сообщения от siber-biber
 
Регистрация: 07.08.2013
Сообщений: 214

на сервере можно урлы красивые рисовать средствами вебсервера ..mode_rewrite например для апача
Ответить с цитированием
  #6 (permalink)  
Старый 10.06.2014, 11:26
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

Сообщение от siber-biber
mode_rewrite
Можно, но править конфиги апача клиент не разрешает. Только в том случае если это нужно 100%. Видимо будем жить с костылем. И кстати... в процессе разработки приложения на ExtJS5 все файлы лежат по своим папкам и запрашиваются каждый раз заново. Но при деплойменте они все пакуются в один, который будет кешироваться браузером. Так что мод реврайт отпадает.
Ответить с цитированием
  #7 (permalink)  
Старый 10.06.2014, 20:32
Профессор
Отправить личное сообщение для siber-biber Посмотреть профиль Найти все сообщения от siber-biber
 
Регистрация: 07.08.2013
Сообщений: 214

Сообщение от Infarch Посмотреть сообщение
Можно, но править конфиги апача клиент не разрешает. Только в том случае если это нужно 100%. Видимо будем жить с костылем. И кстати... в процессе разработки приложения на ExtJS5 все файлы лежат по своим папкам и запрашиваются каждый раз заново. Но при деплойменте они все пакуются в один, который будет кешироваться браузером. Так что мод реврайт отпадает.
Можно продолжать юзать динамическую загрузку ..встречал проекты где так делают и в продакшене. Хотя чаще собирают в один файл.

Ну ок ..если это один файл, можно делать так:
<script src="MyApp/Locale.js"></script>
..или так:
Ext.Loader.loadScript({
    url     : 'MyApp/Locale.js',
    onLoad  : function() {
        ...
    }
});
Ответить с цитированием
  #8 (permalink)  
Старый 11.06.2014, 14:04
Аватар для Infarch
Профессор
Отправить личное сообщение для Infarch Посмотреть профиль Найти все сообщения от Infarch
 
Регистрация: 06.06.2014
Сообщений: 292

Собирать будем 100%. Ну а ресурсы инициализирую в индексе, он то генерится на сервере. Пусть уж так...
Ответить с цитированием
  #9 (permalink)  
Старый 24.06.2014, 13:45
Новичок на форуме
Отправить личное сообщение для bankir Посмотреть профиль Найти все сообщения от bankir
 
Регистрация: 24.06.2014
Сообщений: 4

Я делаю вот так:

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;
		}
	},


В итоге, пока сторы не загружены, висит сообщение "Загрузка справочников..."
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Vacancy: ExtJS developer, full time, telecommute position samuraijack ExtJS 2 26.12.2013 04:29
ExtJS developer, full time, telecommute position samuraijack Работа 1 12.03.2013 13:21
ExtJs - Перевод книги "Lerning ExtJs" MaXyC ExtJS 17 22.06.2012 17:41
[Книги] Learn ExtJS, ExtJS in Action mycoding Учебные материалы 0 23.10.2010 15:07
Москва, ищу JavaScript программиста отлично знающего ExtJS, от 10 USD / час. maximgb Работа 3 03.08.2010 14:34