ExtJS-将Ajax响应变量存储为全局变量

时间:2019-02-01 15:10:28

标签: javascript extjs

我正在尝试将设置存储到全局变量中。

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 :(得分:0)

我们过去在应用启动之前用于初始化设置的一种方法是对HTML文件使用服务器端模板。它什么也没做,只是添加一个<script>块,并用window['prefix_propname'] = 'propvalue';之类的行填充它。这不是最优雅的方式,但它工作得很好。

但是首先,我会重新考虑您是否真的需要使其具有全球性。您可能只是在main的viewmodel中有一个带有设置的数据字段(这些设置已加载到main的控制器的init中),然后根据需要通过其配置将设置的各部分绑定到子级。然后,取决于设置值的逻辑将在子级的config更新/应用方法中,通过将设置作为参数之一的公式表示,或通过绑定(内部视图或控制器)表示。控制器内部的绑定是一个非常方便的功能,在我的使用中经常出现,它消除了必须处理异步加载的烦恼。例如:

// view controller
init: function() {
  var vm = this.getViewModel();
  vm.bind('{settings}', function(settings) {
    //do your thing here
  });
}

答案 1 :(得分:0)

您需要的只是extjs单例。获取成功函数内部单的实例,并指定您的设置给单身。还有一种更简单的方法来添加单例,即通过在窗口对象中添加设置。

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

现在您应该可以在整个应用程序中全局访问设置。仍然console.log将没有实际值,因为将是为ajax调用创建的其他线程,当前执行将继续,而无需等待成功功能。您的“成功”你会看到的内容执行后键入“设置”。