将JSON文件加载到JSON存储区不起作用
下面您可以看到我的登录功能,它实际上正在工作。但它不会将服务器提供的json文件加载到json存储中 “console.log(“加载前存储”,UserStore)”和“console.log(“加载后存储”,UserStore)”显示的消息完全相同,所以我猜“UserStore.load(jsonRes)”根本不起作用。我还尝试了“UserStore.loadData(jsonRes)”和“UserStore.loadRawData(jsonRes)”这两种方法,它们都不起作用(错误:uncaughttypeerror:Object[Object Object]没有方法“loadDataRaw”)。 你能解释一下如何解决这个问题吗?非常感谢将JSON文件加载到JSON存储区不起作用,json,extjs,jsonstore,Json,Extjs,Jsonstore,下面您可以看到我的登录功能,它实际上正在工作。但它不会将服务器提供的json文件加载到json存储中 “console.log(“加载前存储”,UserStore)”和“console.log(“加载后存储”,UserStore)”显示的消息完全相同,所以我猜“UserStore.load(jsonRes)”根本不起作用。我还尝试了“UserStore.loadData(jsonRes)”和“UserStore.loadRawData(jsonRes)”这两种方法,它们都不起作用(错误:unca
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}
“用户”本身看起来是这样的:{“令牌”:“ee80d56688fb7d3a8bcf5939fc9cbcf1”,“标题”:“登录”:“bmuster”,“facebookId”:“firstName”:“Bertha”,“lastName”:“Muster”,“国籍”:“GM”,“生日”:“12/09/82”,“手机”:“+4989111111”,“街道”:“Musterstra\ufffde11”,“城市”:“Musterstadt”,“zipCode”6666666”,“willingToTravel”:“,”图片“:”电子邮件“:”bmuster@example.com“,“publicList”:[]}
我的店铺定义如下:
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'
},
Ext.define('Sabine.view.MeinAccount'{
扩展:“Ext.Container”,
别名:“widget.accview”,
配置:{
最大高度:480,
最大宽度:320,
项目:[{
xtype:'tabpanel',
身高:430,
最大高度:480,
项目:[
{
xtype:'列表',
标题:“Allgemein”,
iconCls:“家”,
莫代尔:错,
deferEmptyText:false,
第三方物流:[
'',
'',
“名字”,
“{firstName}”,
"最后",,
“{lastName}”,
'',
'',
"国籍",,
“{国籍}”,
'',
''
],
store:'Sabine.store.UserStore'
},
您应该试试
success: function (response) {
var loginResponse = response.responseText;
....
}
关于您的问题的几点想法:
- 您有一个未在模型中声明的字段
publicList
不接受模型的实例,相反,它使用服务器的数据加载本地存储store.load
或store.loadData
是您的选择,但是您提到的消息(未捕获类型错误:Object[Object Object]没有方法..)表示您尚未成功检索存储实例。为此,您应首先实例化存储,而不仅仅是声明它;为此,请使用store.loadRawData
方法Ext.create
- 如果您的
已为JSON格式,则不应使用loginResponse.user
Ext.JSON.encode
Sabine.model.user的定义,以及您正在使用的Ext JS版本。谢谢。我的问题现在也包含了模型,…我正在使用Secha Touch 2.0.1.1,这些信息有用吗你?看看你在做什么。响应已经是一个json对象。然后你将它转换成字符串,然后传递到load
。其次,你的响应中user
在哪里?你发布的内容中没有一个键与之匹配。嘿,谢谢你的回答。当我尝试“loginResponse=response.responseText;“它说loginResponse是未定义的。如果您在json响应中提供标志success:true
,请尝试console.log
您的响应变量.console.log(response)=>Object{msg:“OK”,user:Object}“user”本身看起来像这样:{“token”:“ee80d56688fb7d3a8bcf5939fc9cbcf1”,“city”:“NewYork”,“zipCode”:”"66666",...}谢谢你的注释。我想,我现在已经通过在成功函数中添加一些代码启动了存储。我编辑了我的问题,以便你可以看到新的代码。它还将数据加载到该存储。在下一步中,我想将数据放在应用程序的特定视图中,你能给我一些提示如何处理吗?我不知道如何处理从不同的视图访问存储。我还在上面的问题中发布了一个视图示例。@Daniel90很乐意提供帮助。您应该在视图中使用同一个存储,您引用了Sabine.store.UserStore
,并且您的存储id是Sabine.store.MyJsonPStore
。此外,不要使用HTML标记来呈现网格,改为使用Ext.grid.Panel并在items部分将模型中的字段枚举为属性dataIndex
。有关进一步阅读的信息,请参阅,也有一些很好的教程。