0

我正在使用 extjs 4.2,并且在一个地方我正在加载这样的存储对象:

var  userDetailStore = Ext.create('Ext.data.Store', {
    model : 'Person.DetailsModel',
    autoLoad : true,

    proxy : {
        type : 'ajax',
        method : 'POST',
        url : 'getValueAction.action',
        reader : {
            type : 'json',
            root : 'details'
        },
        writer : {
            type : 'json',
            root : 'details'
        }
    },
    fields : ['id','loginName','referenceId' ,'name']
});//Here I load the store which will definitely contain a list of values.

在下一行我想像这样从存储对象中获取第一个值的referenceId

var empId =  userDetailStore.getAt(0).get('referenceId')

我得到了错误,因为到目前为止,商店对象 userDetailStore 的 getCount() 给了我零。但是如果我写一个警报语句,如alert('loading data'); 在我获得 referenceId 的行之前,代码工作正常。行userDetailStore.getCount()给了我确切的值。

所以我认为在加载商店和使用商店之间需要某种延迟,但我不想显示警报。我什至使用sleep()方法代替警报语句。但这也不是工作。(顺便说一句,我什至不想通过执行sleep()来冻结浏览器)

加载商店时我做错了什么吗?有什么通用方法可以在商店完全加载后执行我的代码以使用商店?

有人请在这里帮我...

问候:开发

4

3 回答 3

1

使用 on load 事件在完全加载后获取计数

userDetailStore.on('load', function(){
                alert("Fully loaded");
            });
于 2013-05-22T10:06:52.530 回答
1

Vijay 的答案是正确的,但我想我会扩展这个概念,以便清楚这个答案如何适合你正在做的事情。

重要的是要了解,当您发出 AJAX 请求时,请求是异步的。这实际上意味着(正如您所发现的)调用脚本的其余部分不会等待异步过程完成。相反,当您发出异步请求时,您的脚本将继续以愉快的方式继续执行下一行代码。

因此,如果您考虑一下,这完全可以理解为什么您没有在商店中看到“计数”。虽然您的异步请求正在前往服务器,获取结果,然后将其返回给您的请求,但您的其余代码仍在执行中,忽略了异步请求中发生的事情(这正是为什么异步请求功能强大且很棒)。

这也是为什么添加警报似乎可以“解决”您的问题的原因。当您调用 alert() 时,您实际上会在警报点停止执行脚本。但是,由于您对数据的请求是异步的,因此您单击警报的“确定”按钮(并因此恢复脚本处理)所花费的时间为异步请求提供了足够的时间来完成其生命周期并更新原始调用对象.

鉴于此,可以理解为什么“延迟”似乎是一种可取的方式,因为警报的“延迟”(或实际上是“停止”)解决了您的问题(至少在表面上) . 但是,对于异步请求,您永远无法真正知道需要多长时间才能完成。如果您有较大的响应,或者存在异常的网络延迟或任何其他数量的问题......硬编码延迟可能有效,但也可能无效。最令人抓狂的是,您永远不会得到一致的结果,并且会不断增加“延迟”以适应所有可能导致您的异步请求花费越来越长的事情。

这就是为什么 store 的 load() 事件(以及一般的回调)是一个需要理解和实现的关键概念。通过监听 load() 事件,然后仅在该事件触发的上下文中执行您需要的代码,您可以确定存储对数据的异步请求已完成。

如果您以前没有使用过回调和事件处理,那么确实需要一些时间来适应才能打破线性、程序化的思维方式。然而,在处理一般的 AJAX 请求,特别是像 ExtJS 4 这样的事件驱动框架时,为了构建有效和一致的应用程序,您需要接受这个概念。

于 2013-05-22T11:27:04.880 回答
0

Here set autoload to false and on some action you can use load() to load your store.

store.load({
    callback: function(records, operation, success) {
        // do something after the load finishes
    },
    scope: this
});
于 2013-05-22T10:10:24.070 回答