【问题标题】:extjs store.load not populating, possibly root object issue?extjs store.load 未填充,可能是根对象问题?
【发布时间】:2016-11-24 02:53:48
【问题描述】:

我在加载我的第一个 ExtJS 商店时遇到问题。

        var testStore = Ext.data.StoreManager.lookup('myUserStoreID');
        testStore.load({

        callback: function (records, operation, success) {

            testStore.each(function (record) {
                debugger;
                var task = record.data.description;
                console.log(task);
            });

            //debugger;
            //var x2 = operation._response;
            //var x3 = x2.responseText;
            //var x4 = Ext.decode(x3);
            ////var x3 = Ext.JSON.decode(operation);
            ////var x2 = Ext.decode(operation.response);

            //console.log(testStore);

        }
    });

如果我深入到 operation._response.responseText,我可以在调试器中看到正确的数据,但记录是空白的。所以我知道这与我的代码有关。如果我使用 Ext.decode 它确实返回一个对象。返回数据自动填充我的商店,我做错了什么。

这是 fiddler 中对象的图片。

这是我尝试使用的模型...我知道它还没有所有字段。

Ext.define('ExtApplication1.model.UserModel', {
extend: 'ExtApplication1.model.Base',

requires: ['ExtApplication1.model.Base'],

fields: [
    /*
    The fields for this model. This is an Array of Ext.data.field.Field definition objects or simply the field name.
    If just a name is given, the field type defaults to auto.  For example:
    */
    { name: 'UserID',     type: 'int' },
    { name: 'UserName',      type: 'string' },
    { name: 'password',    type: 'string' },
    { name: 'Email',   type: 'string' },
    { name: 'GroupID' }

],

proxy: {

    type: 'ajax',
    url: 'http://localhost:49537/api/user/gettargetuser/xxx/xxx',

    reader: {
        type: 'json',
        rootProperty: 'JSON'
    }

}

这是我在 webapi 中的用户类

这是我创建商店的 MainModel.js

Ext.define('ExtApplication1.view.main.MainModel', {
extend: 'Ext.app.ViewModel',

alias: 'viewmodel.main',

data: {
    name: 'ExtApplication1',
    appName: xxx,
    appHeaderIcon: '<span class="fa fa-desktop fa-lg app-header-logo">',
    footer: 'Copyright - xxx- x
},

stores: {
        sessionListByInterest: {
            model: 'MainMenuListModel',
            autoLoad: false     //was true
        },
        myUserStore: {
            model: 'UserModel',
            storeId: 'myUserStoreID',
            autoLoad: false
        },

【问题讨论】:

  • 您的 JSON 属性名称与您的 extjs 模型中的字段名称不匹配。例如,您在 JSON 中有“电子邮件”,但模型中有“电子邮件”作为字段名称。如果你解决了这个问题,它会起作用吗?
  • @AmolKatdare 很奇怪,他们实际上匹配......至少电子邮件匹配。我为用户附上了 webapiClass 的图片...电子邮件确实显示为“电子邮件”。所以至少那个道具确实匹配。
  • 这和我的 rootProperty 有关系吗?
  • 另外,在我的 ExtJS 模型中,我是否必须具有在我的 webapi 中定义的导航属性...如您在上面看到的,我有公共虚拟组组,但我没有这在我的 EXTJS 模型中
  • 请出示您的myUserStoreID商店的代码。如果它派生自JsonStore,则默认情况下,商店有自己的代理,它总是优先于模型中定义的代理。

标签: extjs model store


【解决方案1】:

问题是商店希望 rootProperty 包含一个记录数组,而您只提供一条记录。

如果您只想加载不在数组中的单个记录,则必须使用静态 model.load() 函数。

或者您可以将 API 端点从 User JSON 更改为 List&lt;User&gt; JSON(或 IEnumerable&lt;User&gt;ICollection&lt;User&gt;User[]...),即使您打算只返回一个用户。 JSON 数组中有多少条记录无关紧要,但 ExtJS 存储需要该数组。

【讨论】:

  • 让我检查一下...我怎么知道在 rootProperty 的代理中放置什么?
  • 所以我改变了我的电话以返回一些项目,你是对的......它奏效了!感谢您指出这一点!
  • 最后一件事,我在上面贴了我的sql图。在我的 webapi 中,我有所有这些表的类(10 个类)。在 ExtJS 中,我只有 1 个用户模型。现在,当我执行用户的 store.load 时,当我在 webbrower 调试器中查看记录/对象时,我可以深入了解所有 10 个类......所有这些都没有 ExtJS 中的类。我的印象是,如果我有 10 个 webapi 类,我就必须有 10 个 extjs 类。我在这里没有得到什么?
  • 网络浏览器是javascript,JSON是javascript对象表示法。 WebAPI 序列化层次结构中的所有对象,因此反序列化的 JSON 对象包含所有对象。但这并不意味着 ExtJS 可以与所有这些一起工作。只要您不创建完整的 ExtJS 对象层次结构,ExtJS 模型的所有特性(加载到表单、跟踪更改等)都不适用于子模型。我不知道该怎么做,目前只在 ExtJS 中使用平面对象。
  • 感谢@Alexander...猜猜这是有道理的。基本上,如果我想使用 extjs 的功能,我需要有 ExtJS 模型。感谢所有帮助!
猜你喜欢
  • 2013-07-07
  • 2015-11-21
  • 1970-01-01
  • 2014-04-12
  • 2011-06-10
  • 1970-01-01
  • 2011-12-11
  • 2013-03-27
相关资源
最近更新 更多