ExtJS - хранить переменную ответа Ajax как глобальную - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь сохранить настройки в глобальной переменной.

var settings= {};

function on_ready() {
    Ext.Ajax.request({
         url: baseURL,

         success: function(response) {
             settings = Ext.decode(response.responseText);
         },

         failure: function(response) {
             console.log('server-side failure with status code ' + response.status);
         }
    });
}

console.log(settings);

Последняя строка кода отображается пустой.Я знаю, что это асинхронный вызов, и поэтому он не работает.Но не знаю решение.Есть ли способ, как я могу это сделать?Мне нужно использовать эту переменную «settings» во всем приложении.Вот почему он должен быть глобальным.

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Все, что вам нужно, это синглтон extjs.Получить экземпляр синглтона внутри функции успеха и назначить свои настройки этому синглтону.Также есть более простой способ добавить синглтон, то есть путем добавления настроек в вашем объекте окна.

success: function(response) {
             window["settings"] = Ext.decode(response.responseText);
}

Теперь вы сможете получить глобальный доступ к настройкам через приложение. Все еще не будет иметь фактического значения console.log, потому что будет другой поток, созданный для вызова ajax, текущее освобождение продолжится без ожиданияфункция успеха.Вы вводите «настройки» после выполнения «успеха», вы увидите содержимое.

0 голосов
/ 01 февраля 2019

Один из подходов, который мы использовали в прошлом для инициализации настроек перед запуском приложения, заключался в использовании шаблонов на стороне сервера для файла html.Он больше ничего не сделал, а просто добавил блок <script> и заполнил его строками типа window['prefix_propname'] = 'propvalue';.Не самый элегантный способ, но он работал нормально.

Но сначала я бы подумал, если вам действительно нужно, чтобы он был глобальным.Вполне вероятно, что вы могли бы просто иметь поле данных в viewmodel main с настройками (которые загружаются при инициализации контроллера main), а затем связывать части настроек по мере необходимости с детьми через их конфигурацию.Логика, зависящая от значения настроек, будет либо в методах обновления / применения дочерней конфигурации, выраженных через формулы с настройками в качестве одного из параметров, либо через привязку (внутренний вид или контроллер).Привязки внутри контроллера - это очень удобная функция, которая довольно часто встречается в моем использовании, и она устраняет раздражение от необходимости иметь дело с асинхронной загрузкой;например:

// view controller
init: function() {
  var vm = this.getViewModel();
  vm.bind('{settings}', function(settings) {
    //do your thing here
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...