Ext JS 4 存储加载回调

Posted

技术标签:

【中文标题】Ext JS 4 存储加载回调【英文标题】:Ext JS 4 store load callback 【发布时间】:2012-06-13 12:07:57 【问题描述】:

我正在尝试为我的学校项目构建一个简单的用户设置功能。 我已经创建了一个这样的数据模型:

Ext.define('Urlopy.Model.UserPreferences', 
        extend : 'Ext.data.Model',
        idProperty : 'userID',
        fields : [
                    name : 'userID',
                    type : 'string'
                , 
                    name : 'admin',
                    type : 'bool'
                ]
    );

还有这样的商店:

Ext.define('Urlopy.Store.UserPreferences', 
        extend : "Ext.data.Store",
        autoLoad : false,
        autoSync : true,
        batch : false,
        proxy : 
            type : 'ajax',
            sortParam : undefined,
            startParam : undefined,
            pageParam : undefined,
            limitParam : undefined,
            noCache : false,
            headers : 
                "Content-Type" : "application/json; charset=utf-8"
            ,
            api : 
                read : 'services/UserPreferences.asmx/Get',
                update : 'services/UserPreferences.asmx/Update'
            ,
            reader : 
                type : 'json',
                root : 'd.data'
            ,
            writer : 
                type : 'json',
                encode : false,
                writeAllFields : true,
                root : 'data'
            
        ,
        model : 'Urlopy.Model.UserPreferences'
    );

当用户登录时,我想在我的应用程序中获取他的偏好。

我有这样的功能:

onLogin : function() 

            this.createGlobalStores();

            this.userPreferenceStore.load(

                        callback : function(r, options, success) 
                            console.log(r.data)
                        

                    );

        ,
        createGlobalStores : function() 
            this.userPreferenceStore = Ext.create("Urlopy.Store.UserPreferences");
        ,

我想在回调中做的是获取用户ID并显示它,即使使用简单的警报。

现在我得到的只是在萤火虫中显示的未定义。

我来自服务器的 json 数据如下所示:

"d":"__type":"Urlopy.services.UserPreference","userID":"12445","admin":true

我需要能够调用该商店的加载方法并在回调中从模型中获取特定属性。我的商店将永远有 1 件商品! (还有其他方法吗?)

欢迎任何关于为什么这不起作用的想法!

编辑 我已将服务器脚本更改为像这样返回 json:

"d":"data":"userID":"12-44-55","admin":true

这很好用,不需要在对象周围添加额外的 []。

【问题讨论】:

【参考方案1】:

首先,存储的负载需要一个数组,其次您为代理设置了错误的根。因为您的 json 中没有 d.data 对象。简单的解决方法是将您的 json 数据编码为具有一个元素的数组,并且该数组的标记为“数据”...

"d":["__type":"Urlopy.services.UserPreference","userID":"12445","admin":true]

只需将根设置为 d

reader : 
    type : 'json',
    root : 'd'

在回调之后,您将拥有一个包含一个元素的记录数组,您可以使用索引 0 轻松访问该元素

callback : function(records, options, success) 
    console.log(records[0].data.userID +" " + records[0].data.admin);

编辑

不涉及店铺的其他方式

做一个简单的ajax请求,比如:

Ext.Ajax.request(
            url: 'services/UserPreferences.asmx/Get',
            params: /*if you want any extra params to be sent*/,
            scope: this,
            success: function (result) 
                var response = Ext.decode(result.responseText);
                //this is for your initial json
                alert(response.d.userID);
            ,
            failure: function (result) 
                alert('something failed')    
            
        );

我不知道您对数据做了什么,但例如您可以将其加载到表单中,对于更新方法,您将拥有表单的提交选项。可以配置发送数据的url。

【讨论】:

嗯..我会马上修好吗?是否有任何其他选项可以加载该对象而不是数组?我知道我可以使用商店,但也许还有其他方法? 感谢您的编辑 :) 我想要的是一个包含所有用户配置的全局对象,我将能够读取设置并更新它们。我已经做到了。我已经使用基于您的解决方案编辑了我的问题。

以上是关于Ext JS 4 存储加载回调的主要内容,如果未能解决你的问题,请参考以下文章

中止 ext js 网格存储 ajax 调用

如何在 ext js 4.1 中重新加载商店?

在触发单击 Extjs 3.4 时重新加载 ComboBox 存储

ExtJS 4 存储回调函数不获取记录

ExtJS 4:存储数据未填充存储加载回调函数中的数据

Ext JS 4 - 如何在视图中显示其他视图?