【问题标题】:Load JSON file into JSON-Store is not working将 JSON 文件加载到 JSON-Store 中不起作用
【发布时间】:2013-07-17 03:55:43
【问题描述】:

您可以在下面看到我的登录功能,该功能实际上正在运行。但它不会将服务器提供的 json 文件加载到 JSON Store 中。

"console.log("Store before load",UserStore)" 和 "console.log("Store after load",UserStore)" 显示完全相同的消息,所以我猜 "UserStore.load(jsonRes)" 是根本不工作。我还尝试了“UserStore.loadData(jsonRes)”和“UserStore.loadRawData(jsonRes)”,它们都不起作用(错误:未捕获的 TypeError:Object[object Object] 没有方法 'loadDataRaw')。 你能解释一下如何解决这个问题吗?非常感谢。

Ext.util.JSONP.request({

url: 'http://127.0.0.1:4712/talentcommunity/getuserinfo',

headers: { 
    'content-type': 'application/x-www-form-urlencoded ; charset=utf-8'
},

method: 'post',

params: {
    user:data1,
    pw:data2
},

callbackName: 'myCallback',

success: function (response) {

    var loginResponse = response;
    if (loginResponse.msg == "OK") {
        var UserStore = Ext.create('Ext.data.Store', {
            model: 'Sabine.model.user',
            data: response.user
        });
        me.signInSuccess();
    }
    else{
        loginView.showSignInFailedMessage('token null.');   
    } 

},

提供的 Json 文件如下所示:

{msg: "OK", user: Object}

“用户”本身看起来像这样:{"token":"ee80d56688fb7d3a8bcf5939fc9cbcf1","title":"","login":"bmuster","facebookId":"","firstName":"Bertha","lastName":"Muster","nationality":"GM","birthDay":"12/09/82","phone":"+4989111111","mobile":"+4918111111","street":"Musterstra\ufffde 11","city":"Musterstadt","zipCode":"66666","willingToTravel":"","pictureUrl":"","eMail":"bmuster@example.com","publicList":[]}

My Store 定义如下:

Ext.define('Sabine.store.MyJsonPStore', {
extend: 'Ext.data.Store',

requires: [
    'Sabine.model.user'
],

config: {
    autoLoad: true,
    autoSync: true,
    clearOnPageLoad: false,
    model: 'Sabine.model.user',
    storeId: 'myStore'
}
});

对应型号:

Ext.define('Sabine.model.user', {
extend: 'Ext.data.Model',

config: {
    fields: [
        {
            name: 'token',
            type: 'string'
        },
        {
            name: 'title'
        },
        {
            name: 'login'
        },
        {
            name: 'facebookId'
        },
        {
            name: 'firstName',
            type: 'string'
        },
        {
            name: 'lastName',
            type: 'string'
        },
        {
            name: 'nationality',
            type: 'string'
        },
        {
            name: 'birthDay',
            type: 'string'
        },
        {
            name: 'phone'
        },
        {
            name: 'mobile'
        },
        {
            name: 'street'
        },
        {
            name: 'city',
            type: 'string'
        },
        {
            name: 'zipCode',
            type: 'int'
        },
        {
            name: 'willingToTravel'
        },
        {
            name: 'pictureUrl'
        },
        {
            name: 'eMail'
        },
        {
            name: 'publicList'
        }
    ]
}
});

视图示例:

Ext.define('Sabine.view.MeinAccount', {
    extend: 'Ext.Container',
    alias: 'widget.accview',
    config: {
        maxHeight: 480,
        maxWidth: 320,
    items: [{
        xtype: 'tabpanel',
        height: 430,
        maxHeight: 480,
        items: [
            {
            xtype: 'list',
            title: 'Allgemein',
            iconCls: 'home',
            modal: false,
            deferEmptyText: false,
            itemTpl: [
                '<table border = "0">',
                '<tr>',
                ' <td>Firstname</td>',
                ' <td>{firstName}</td>',
                ' <td>Last<name/td>',
                ' <td>{lastName}</td>',
                '</tr>',
                '<tr>',
                ' <td>Nationality</td>',
                ' <td>{nationality}</td>',
                '</tr>',
                '</table>'
            ],
            store: 'Sabine.store.UserStore'
     },

【问题讨论】:

  • 请发布您的商店的定义。
  • 嘿,我在上面编辑了我的问题。现在你可以看到商店的定义了。
  • 我忘记问了,请把Sabine.model.user的定义也贴一下,以及你使用的Ext JS的版本。谢谢。
  • 我的问题现在也包含模型,.. 我正在使用 Secha Touch 2.0.1.1,这些信息对您有帮助吗?
  • 看看你在做什么。响应已经是一个 json 对象。然后将其转换为字符串,然后传递给load。其次,您的回复中的user 在哪里?您发布的内容中没有一个与此匹配。

标签: json extjs jsonstore


【解决方案1】:

关于您的问题的一些想法:

  • 您有一个未在模型中声明的字段 publicList
  • store.load 不接受模型的实例,相反 - 它使用来自服务器的数据加载您的本地存储
  • store.loadDatastore.loadRawData 是你要走的路,但是你提到的消息 (Uncaught TypeError: Object[object Object] has no method..) 表明你没有成功检索到 store 的实例。为此,您应该首先实例化商店,而不仅仅是声明它;为此使用Ext.create 方法
  • 如果您的loginResponse.user 已经是JSON 格式,则不应使用Ext.JSON.encode

【讨论】:

  • 感谢您的注释。我想,我现在已经通过在成功函数中放置一些代码来启动商店。我编辑了我的问题,以便您可以看到新代码。它还将数据加载到该存储中。在下一步中,我想将数据放到应用程序的特定视图中,你能给我一些提示如何处理吗?我不知道如何从不同的视图访问商店。我还在上面的问题中发布了一个视图示例。
  • @Daniel90 很高兴为您提供帮助。你应该在你的视图中使用同一个商店,在那里你引用Sabine.store.UserStore,你的商店的id是Sabine.store.MyJsonPStore。此外,不要使用 HTML 标记来呈现网格,而是使用 Ext.grid.Panel 并在项目部分中将模型中的字段枚举为属性dataIndex。请参阅docs.sencha.com/extjs/4.2.1/#!/api/Ext.grid.Panel 以进一步阅读,也有很棒的教程。
【解决方案2】:

你应该试试

success: function (response) {

    var loginResponse = response.responseText;
    ....
}

【讨论】:

  • 嘿,谢谢你的回答..当我尝试“loginResponse = response.responseText;”时它说 loginResponse 未定义。
  • 如果您在 json 响应中提供标志 success: true
  • 尝试console.log你的响应变量。
  • console.log(response) => Object {msg: "OK", user: Object} 'user' 本身看起来像这样: {"token":"ee80d56688fb7d3a8bcf5939fc9cbcf1",...., "city":"NewYork","zipCode":"66666",...}
猜你喜欢
  • 2014-11-22
  • 2017-06-12
  • 2021-07-01
  • 2012-12-02
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
相关资源
最近更新 更多