繁体   English   中英

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

[英]ExtJS - Store Ajax response variable as a global

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

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”变量。 这就是为什么它必须是全球性的。

我们过去在应用启动之前用于初始化设置的一种方法是使用html文件的服务器端模板。 它什么也没做,只是添加一个<script>块,并用window['prefix_propname'] = 'propvalue';等行填充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
  });
}

您只需要一个extjs单例。 在成功函数中获取单例的实例,然后将设置分配给该单例。 还有一种更简单的方法来添加单例,即通过在窗口对象中添加设置。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM