ExtJs在LOAD的时候就出错? 急.....!!! 本帖最后由 chessman_mak 于 2010-01-26 15:34:18 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看了半天也没有发现错误,用firebug 调试下吧。看看到底错在哪里了? 用fire bug调试.. 在"Ext.onReady(function() {" 这里就已经跳过中间所有东西就完了.~ 不知道为什么.. 还有这一句: var grid = new Ext.grid.GridPanel它说我缺少对像 究竟是什么回事阿??? 跳过所有的东西,就是因为里面的function()写错了。 var grid = new Ext.grid.GridPanel 它说我缺少对像,是不是你引入的js少了或者路径错误?还是里面的写法有误?把不必要的空行删了 JsonStore 没有root这个属性吧 去掉看看 可以用 FF的friebug 调试看看 是具体哪里出现的错误。肯定是你的代码写错了 仔细检查一下你写的代码 var grid = new Ext.grid.GridPanel({ store: myStore, 这里注意,gridPanel的数据源,是ds,意思这里应该写 ds:myStroe,而不是myStroe;给你个我写的,简单的例子吧:var store = new Ext.data.Store({// 这是数据源 proxy : new Ext.data.HttpProxy({ url : 'test.do?function=page' }), reader : new Ext.data.JsonReader({ root : 'root', totalProperty : 'total' }, ['LSH', 'YWMS', 'CYRY', 'CYRQ', 'CYJG']) });var grid = new Ext.grid.GridPanel({ sm : new Ext.grid.RowSelectionModel({ singleSelect : true }),// 单选模式 frame : true, title : '查验记录', ds : store, loadMask : { // 加载动画效果 msg : '正在装载数据,请稍侯……' }, columns : [{ header : "查验人员", dataIndex : 'CYRY' }, { header : "查验时间", dataIndex : 'CYRQ' }, { header : "查验结果", dataIndex : 'CYJG', id : 'CYJG' }], bbar : pagingBar }); 嗯,不好意思,上面弄错了!ds和store是一样的道理,不知道你的JsonStore写法是不是有错,root,这些都是在JsonReader里面来设置的,还有就是注意你的JSON格式是不是和你的对应,比如说,你的root:'d',那么返回格式上,是不是对应的d:[{TermId:'' .....}]这种格式来显示的 而且还有一点,totalProperty也是你store需要的,来获得总的分页数据的。。 阿..你说得很好阿.. 我也怀疑是我的jsonstore写错了.. 那一个root 我也不太清楚是不是返回'd' 但是.. 如果我不写baseParams 这一句的话.. 和修改一下web service里面的方法为不用传参的话.. 就可以正常输出数据.. 显示也没有问题. 究竟是为什么呢?? 应该要有root的.. 因为我从web service输出的是一个list<T> 要怎样才能看到从web service传过来的json是什么样子的呢??? 很多都是 json写的不对 你打印json内容看看 对,你把json打印出来看看。主要看格式。 myStore.on('beforeload', function(thisStore, options){ store.baseParams = { id:'aa' }; });你改成这样,以前我直接在stroe里面写baseParams 也出现过缺少对象的错误 现在传参没问题了.. 只是gridPanel不能显示数据.. 应该是context type的问题.. 但是.我看别人的例子都没有写context type上去阿.. 你后台调试能得到数据吗?先看看你得到的数据有问题没有。另外你是在什么地方load的,load以后刷新grid了吗 后台得到数据了.. 一个XML 然后前台.我用JsonStore 来取. 或者是.用JsonReader 来读 .都没有数据.. 但是如是我改用XmlReader来读的话.就什么问题都没有.. 很奇怪.. 但是如果用XML的话.那么数据量就很大... 所以 我不选择用XML.. 我是在最后LOAD的.. 定义了store 和 gridpanel 之后 那应该是你json的格式有问题了,这个你要仔细看看了还有一个不显示原因是数据类型不对应这个我想在你这里面应该不存在 你既然后台生成的是XML,使用XmlReader就能正常解析,如果你非要使用JsonReader的话,那么你在后台,就要将XML转换成JSON的数据格式,那岂不是多走一条路? 你Xml文件量很大,那转换成JSON的数据量就会少很多么? 这里只是用不同的数据格式来表达罢了 我尝试过用JQUERY来取后台传过来的数据 然后用Fiddler来看json有没有问题.. 然后看到json是这样的.{"d":[{"__type":"BLL.PttCmd","MsgTime":"\/Date(1262244898233)\/","TermId":"NBA","ShiftSN":"200912312200","CmdType":"a2","CmdMsg":null,"MsgWay":0,"IsSucc":0,"T_isRec":0,"T_IsCommit":0,"SendTime":"\/Date(-62135596800000)\/","RecvTime":"\/Date(-62135596800000)\/","CommitTime":"\/Date(-62135596800000)\/","CardId":null,"SimNo":null,"StartTime":"\/Date(-62135596800000)\/","EndTime":"\/Date(-62135596800000)\/","OperTime":"\/Date(-62135596800000)\/","OperId":null,"OperName":null,"OperIpAddr":null}]}我的jquery是这样写的.$(function() { $.ajax({ type: "POST", contentType: "application/json", url: 'PttGetData.asmx/qryCancelableById', data: "{id:'nba'}", dataType: 'json', success: function(result) { } }); });然后.我再尝试用我原本的extjs 来运行一次. 再用fiddler来看. 发现数据只是普通的XML.. 楼主,像JS,Ext这种之类的代码,从最简单的写起吧,再慢慢扩展开来。错误找不出来的时候,也这样来,先只留住主干,这样很容易知道错误在哪里。再添加枝叶。基本上可以搞定问题。 我已经重写一次了看代码Ext.onReady(function() { var cm = new Ext.grid.ColumnModel([ new Ext.grid.RowNumberer(), { header: "终端号", width: 150, dataIndex: 'TermId' } ]); var ds = new Ext.data.Store({ autoLoad: true, baseParams: { id: 'nba' }, proxy: new Ext.data.HttpProxy({ url: 'PttGetData.asmx/qryCancelableById', method: 'POST' }), reader: new Ext.data.JsonReader( { root: 'd', fields: [{ name: 'TermId'}] }) }); var grid = new Ext.grid.GridPanel({ ds: ds, cm: cm, loadMask: { msg: '正在加载数据,请稍侯……' }, height: 260, width: 1280, viewConfig: { forceFit: true }, buttons: [{ text: '核销'}], frame: true, el: 'CAV' }); grid.render(); ds.load();})但是问题依旧.. 是不是我的web service 里面要做什么的调整?我放我的web service上来using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.Services;using BLL;using System.Web.Script.Services;namespace ExtJs_Demo{ /// <summary> /// PttGetData 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 [System.Web.Script.Services.ScriptService] public class PttGetData : System.Web.Services.WebService { CancelAfterVerify cav = new CancelAfterVerify(); /// <summary> /// Get Detail by Terminal ID /// </summary> /// <param name="id"></param> /// <returns></returns> [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public List<PttCmd> qryCancelableById(string id) { List<PttCmd> setOfdtl = new List<PttCmd>(cav.qryCancelableById(id)); return setOfdtl; } }}一切都像很简单..偏偏搞了我几天 ds.load();grid.render();这里先换一下,EXT2。0有这个问题 我发现一个问题. 我用Fiddler debug的时候.发现到.Content-Type: application/x-www-form-urlencoded; charset=UTF-8 这个.. 所以我就写一句Ext.lib.Ajax.defaultPostHeader = 'application/json;charset=UTF-8';来改变它.. 但是.这样子就出错了. {"Message":"无效的 JSON 基元: id。","StackTrace":" 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n 在 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n 在 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n 在 System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\r\n 在 System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n 在 System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"} 来自chessman_mak(麦子)的回复,由于他已经不能回复该贴了感谢chessman_mak的人心帮助,以下是他的回复:我的问题已经解决了.~~ 最后发现是因为ExtJs的HTTP 请求方式不是用 content-type:application/json. 所以webservice 就不会自动给你返回json格式的数据.. 所以你必须要改变content-type才行.. 寻怎样做呢? 其实有几个方法.. 一种方法是在你的请求webservice之前先修改了content-type..还有另外一种就是 有请求的时候顺便改这个content-type 这也是我所选的 //Get Data Source var ds = new Ext.data.Store({ autoLoad: true, proxy: new Ext.data.HttpProxy({ url: 'PttGetData.asmx/qryCancelableById', method: 'POST', header: 'application/json;charset=utf-8', // Change your HTTP Header jsonData: Ext.util.JSON.encode({ id: termId }) // 注意.... 一定要用json格式的数据来传参 }) 关于这个问题看到大家的回答以及解决办法基本上跟我以前摸索出来的老路差不多,不过有一点就是以上的办法都不能解决分页问题,WebService返回的数据会在你定义的数据外面再加一层:{d:[你的数据]},所以,要想彻底解决还是得从前台入手,我这里有详细的完善的解决办法:http://blog.csdn.net/zuo85/archive/2010/12/22/6091564.aspx 我也遇到了类似的问题,我的应用很简单,是个登录界面,form=new Ext.form.FormPanel 这句对象不存在,但我在ie6下是正常的,未提示错误。 tomcat问题 java上传整个目录的实现方法? 一个较初级的问题,会的人应该很多,在线等 急啊``在线等``大家来看看 Javaweb开发 tomcat 5.0的设置 解决了再加50分 奇怪的JSP乱码问题!问题解决就结贴 jsp+uploadify+servlet的实现问题 一套程序访问多个数据库100个以上 我都哭了,帮帮我吧resultSet = statement.executeQuery(test);问题 jxl解析excel,存入数据库重复问题怎么解决
var grid = new Ext.grid.GridPanel
它说我缺少对像
究竟是什么回事阿???
跳过所有的东西,就是因为里面的function()写错了。
var grid = new Ext.grid.GridPanel
它说我缺少对像,是不是你引入的js少了或者路径错误?还是里面的写法有误?把不必要的空行删了
可以用 FF的friebug 调试看看 是具体哪里出现的错误。肯定是你的代码写错了 仔细检查一下你写的代码
store: myStore,
这里注意,gridPanel的数据源,是ds,意思这里应该写 ds:myStroe,而不是myStroe;
给你个我写的,简单的例子吧:
var store = new Ext.data.Store({// 这是数据源
proxy : new Ext.data.HttpProxy({
url : 'test.do?function=page'
}),
reader : new Ext.data.JsonReader({
root : 'root',
totalProperty : 'total'
}, ['LSH', 'YWMS', 'CYRY', 'CYRQ', 'CYJG'])
});var grid = new Ext.grid.GridPanel({ sm : new Ext.grid.RowSelectionModel({
singleSelect : true
}),// 单选模式 frame : true,
title : '查验记录',
ds : store,
loadMask : { // 加载动画效果
msg : '正在装载数据,请稍侯……'
},
columns : [{
header : "查验人员",
dataIndex : 'CYRY'
}, {
header : "查验时间",
dataIndex : 'CYRQ'
}, {
header : "查验结果",
dataIndex : 'CYJG',
id : 'CYJG'
}],
bbar : pagingBar
});
而且还有一点,totalProperty也是你store需要的,来获得总的分页数据的。。
应该要有root的.. 因为我从web service输出的是一个list<T>
要怎样才能看到从web service传过来的json是什么样子的呢???
你打印json内容看看
store.baseParams = {
id:'aa'
};
});你改成这样,以前我直接在stroe里面写baseParams 也出现过缺少对象的错误
现在传参没问题了.. 只是gridPanel不能显示数据.. 应该是context type的问题.. 但是.我看别人的例子都没有写context type上去阿..
先看看你得到的数据有问题没有。另外你是在什么地方load的,load以后刷新grid了吗
后台得到数据了.. 一个XML 然后前台.我用JsonStore 来取. 或者是.用JsonReader 来读 .都没有数据.. 但是如是我改用XmlReader来读的话.就什么问题都没有.. 很奇怪.. 但是如果用XML的话.那么数据量就很大... 所以 我不选择用XML.. 我是在最后LOAD的.. 定义了store 和 gridpanel 之后
我尝试过用JQUERY来取后台传过来的数据 然后用Fiddler来看json有没有问题.. 然后看到json是这样的.{"d":[{"__type":"BLL.PttCmd","MsgTime":"\/Date(1262244898233)\/","TermId":"NBA","ShiftSN":"200912312200","CmdType":"a2","CmdMsg":null,"MsgWay":0,"IsSucc":0,"T_isRec":0,"T_IsCommit":0,"SendTime":"\/Date(-62135596800000)\/","RecvTime":"\/Date(-62135596800000)\/","CommitTime":"\/Date(-62135596800000)\/","CardId":null,"SimNo":null,"StartTime":"\/Date(-62135596800000)\/","EndTime":"\/Date(-62135596800000)\/","OperTime":"\/Date(-62135596800000)\/","OperId":null,"OperName":null,"OperIpAddr":null}]}
我的jquery是这样写的.$(function() { $.ajax({
type: "POST",
contentType: "application/json",
url: 'PttGetData.asmx/qryCancelableById',
data: "{id:'nba'}",
dataType: 'json',
success: function(result) {
}
});
});然后.我再尝试用我原本的extjs 来运行一次. 再用fiddler来看. 发现数据只是普通的XML..
new Ext.grid.RowNumberer(),
{ header: "终端号", width: 150, dataIndex: 'TermId' }
]); var ds = new Ext.data.Store({
autoLoad: true,
baseParams: { id: 'nba' },
proxy: new Ext.data.HttpProxy({
url: 'PttGetData.asmx/qryCancelableById',
method: 'POST'
}), reader: new Ext.data.JsonReader(
{
root: 'd',
fields: [{ name: 'TermId'}]
})
}); var grid = new Ext.grid.GridPanel({
ds: ds,
cm: cm,
loadMask: { msg: '正在加载数据,请稍侯……' },
height: 260,
width: 1280,
viewConfig: { forceFit: true },
buttons: [{ text: '核销'}],
frame: true,
el: 'CAV'
}); grid.render();
ds.load();
})但是问题依旧.. 是不是我的web service 里面要做什么的调整?我放我的web service上来
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using BLL;
using System.Web.Script.Services;namespace ExtJs_Demo
{
/// <summary>
/// PttGetData 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
[System.Web.Script.Services.ScriptService]
public class PttGetData : System.Web.Services.WebService
{
CancelAfterVerify cav = new CancelAfterVerify(); /// <summary>
/// Get Detail by Terminal ID
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public List<PttCmd> qryCancelableById(string id)
{
List<PttCmd> setOfdtl = new List<PttCmd>(cav.qryCancelableById(id));
return setOfdtl;
}
}
}一切都像很简单..偏偏搞了我几天
grid.render();
这里先换一下,EXT2。0有这个问题
Content-Type: application/x-www-form-urlencoded; charset=UTF-8 这个.. 所以我就写一句
Ext.lib.Ajax.defaultPostHeader = 'application/json;charset=UTF-8';
来改变它.. 但是.这样子就出错了. {"Message":"无效的 JSON 基元: id。","StackTrace":" 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n 在 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n 在 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n 在 System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\r\n 在 System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n 在 System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"}
感谢chessman_mak的人心帮助,以下是他的回复:
我的问题已经解决了.~~
最后发现是因为ExtJs的HTTP 请求方式不是用 content-type:application/json. 所以webservice 就不会自动给你返回json格式的数据.. 所以你必须要改变content-type才行..
寻怎样做呢? 其实有几个方法.. 一种方法是在你的请求webservice之前先修改了content-type..
还有另外一种就是 有请求的时候顺便改这个content-type 这也是我所选的
//Get Data Source
var ds = new Ext.data.Store({
autoLoad: true,
proxy: new Ext.data.HttpProxy({
url: 'PttGetData.asmx/qryCancelableById',
method: 'POST',
header: 'application/json;charset=utf-8', // Change your HTTP Header
jsonData: Ext.util.JSON.encode({ id: termId }) // 注意.... 一定要用json格式的数据来传参
})