使用了dojo开发。在datagrid过滤的时候。为了让过滤好处理,直接设置为完全二叉树的方式来存查询条件。但是在提交数据的时候,默认是get?url的方式。结果导致条件选择一两个,url会特别长。然后会报404错误。差点把前面的设计推掉,重来。项目就差一小部分了。时间上也来不及了。硬着头皮,看了一天的js源代码,我只能说,俺对js的世界无法理解啊。反复的试验了好久,硬是将rest的get请求,改为了post请求。代码如下:
1 require(["dojo/_base/declare", "dojox/rpc/JsonRest", "dojox/data/JsonRestStore", "dojo/dom", "dojo/domReady!"],
2 function (declare, rpcJsonRest,JsonRestStore, locale, dom) {
3 return declare("mydata.JsonRestStore", [dojox.data.JsonRestStore], {//我的rest并不标准{Data:data,ErrorNo:1,ErrorInfo:errorinfo}这种形式。
4 _processResults: function (results, deferred) {
5 // index the results
6 if (results.ErrorNo > 0) {
7 alert(results.ErrorInfo);
8 throw new Error(results.ErrorInfo || '');
9 }
10 var count = results.Data.TotalRowCount;
11 results = results.Data.Items;
12 // if we don't know the length, and it is partial result, we will guess that it is twice as big, that will work for most widgets
13 return { totalCount: deferred.fullLength || (deferred.request.count == count ? (deferred.request.start || 0) + count * 2 : count), items: results };
14 },
15 _doQuery: function (args) {//重写了一个_doQuery
16 var query = typeof args.queryStr == 'string' ? args.queryStr : args.query;
17 //var myservice = this.service({}, args);
18 var myservice = this.service._getRequest({ operation: query.operation }, args)//从这里开始新的调用。
19 var xhrArgs = {
20 url: myservice.url,
21 handleAs: "json",
22 headers: {
23 Accept: "application/json,application/Javascript",
24 Range: myservice.headers.Range
25 },
26 content: { filtercodtion: query.filtercodtion }
27 };
28 var deferred = dojo.xhrPost(xhrArgs); //rpcJsonRest.query(this.service, query, args);原来的调用。
29 var self = this;
30 if (this.loadReferencedSchema) {
31 deferred.addCallback(function (result) {
32 var contentType = deferred.ioArgs && deferred.ioArgs.xhr && deferred.ioArgs.xhr.getResponseHeader("Content-Type");
33 var schemaRef = contentType && contentType.match(/definedby\s*=\s*([^;]*)/);
34 if (contentType && !schemaRef) {
35 schemaRef = deferred.ioArgs.xhr.getResponseHeader("Link");
36 schemaRef &#61; schemaRef && schemaRef.match(/<([^>]*)>;\s*rel&#61;"?definedby"?/);
37 }
38 schemaRef &#61; schemaRef && schemaRef[1];
39 if (schemaRef) {
40 var serviceAndId &#61; rpcJsonRest.getServiceAndId((self.target &#43; schemaRef).replace(/^(.*\/)?(\w&#43;:\/\/)|[^\/\.]&#43;\/\.\.\/|^.*\/(\/)/, "$2$3"));
41 var schemaDeferred &#61; rpcJsonRest.byId(serviceAndId.service, serviceAndId.id);
42 schemaDeferred.addCallbacks(function (newSchema) {
43 lang.mixin(self.schema, newSchema);
44 return result;
45 }, function (error) {
46 alert(error);
47 console.error(error); // log it, but don&#39;t let it cause the main request to fail
48 return result;
49 });
50 return schemaDeferred;
51 }
52 return undefined;//don&#39;t change anything, and deal with the stupid post-commit lint complaints
53 });
54 }
55 return deferred;
56 }
57 });
58 }
59 );
解决问题的思路因为觉得太复杂[的确是复杂]&#xff0c;而不知道怎么入手。要改变方法。耗的时间太久了。