Hello Tony,
during answering on the question on the stackoverflow I found a bug in jqGrid. I posted small pragmatical fix in the pull request. One can use the demo to reproduce the problem. Another demo uses the suggested fix and it works (sorting and searching) correctly. Below I post the analyse of the problem.
The problem exist is one uses
1 |
localReader: {repeatitems: true} |
option. In the case the items of data will be saved in the form in which are included in the input. For example like
1 |
{ id: "50", Â cell: ["test5", Â "2007-10-31", "300.00", "20.00", "320.00", "false", "FE", "note5"] } |
The problem is that all parts of local sorting and local filtering/searching works incorrectly in the case. The reason are the calls
1 |
<span class="nx" style="color: #333333">query</span><span class="p" style="color: #333333">.</span><span class="nx" style="color: #333333">orderBy</span><span class="p" style="color: #333333">(</span><span class="nx" style="color: #333333">ts</span><span class="p" style="color: #333333">.</span><span class="nx" style="color: #333333">p</span><span class="p" style="color: #333333">.</span><span class="nx" style="color: #333333">sortname</span><span class="p" style="color: #333333">,...)</span> |
see the lines of addLocalData. It uses ts.p.sortname as the first parameter (by parameter) of orderBy, which will be forwarded to orderBy (see the line) and so on. As the result the line
1 |
<span class="nx" style="color: #333333">ab</span><span class="o" style="font-weight: bold;color: #333333">=</span><span class="nx" style="color: #333333">by</span><span class="o" style="font-weight: bold;color: #333333">!==</span><span class="s2" style="color: #dd1144">""</span><span class="o" style="font-weight: bold;color: #333333">?</span><span class="nx" style="color: #333333">$</span><span class="p" style="color: #333333">.</span><span class="nx" style="color: #333333">jgrid</span><span class="p" style="color: #333333">.</span><span class="nx" style="color: #333333">getAccessor</span><span class="p" style="color: #333333">(</span><span class="nx" style="color: #333333">v</span><span class="p" style="color: #333333">,</span><span class="nx" style="color: #333333">by</span><span class="p" style="color: #333333">)</span><span class="o" style="font-weight: bold;color: #333333">:</span><span class="nx" style="color: #333333">v</span><span class="p" style="color: #333333">;</span> |
will be used with the name instead of the index in colModel (without taking in considerations cb, rn and subgrid columns). It’s the reason why local sorting not works.
In the same way another line of addLocalData
1 |
<span class="nx" style="color: #333333">query</span><span class="o" style="font-weight: bold;color: #333333">=</span><span class="nx" style="color: #333333">compareFnMap</span><span class="p" style="color: #333333">[</span><span class="nx" style="color: #333333">ts</span><span class="p" style="color: #333333">.</span><span class="nx" style="color: #333333">p</span><span class="p" style="color: #333333">.</span><span class="nx" style="color: #333333">postData</span><span class="p" style="color: #333333">.</span><span class="nx" style="color: #333333">searchOper</span><span class="p" style="color: #333333">](</span><span class="nx" style="color: #333333">query</span><span class="p" style="color: #333333">)(</span><span class="nx" style="color: #333333">ts</span><span class="p" style="color: #333333">.</span><span class="nx" style="color: #333333">p</span><span class="p" style="color: #333333">.</span><span class="nx" style="color: #333333">postData</span><span class="p" style="color: #333333">.</span><span class="nx" style="color: #333333">searchField</span><span class="p" style="color: #333333">,...</span><span class="p" style="color: #333333">);</span> |
uses ts.p.postData.searchField as the first parameter of compare functions. So the line
1 |
<span class="nx" style="color: #333333">fld</span><span class="o" style="font-weight: bold;color: #333333">=</span><span class="s1" style="color: #dd1144">'jQuery.jgrid.getAccessor(this,''</span><span class="o" style="font-weight: bold;color: #333333">+</span><span class="nx" style="color: #333333">f</span><span class="o" style="font-weight: bold;color: #333333">+</span><span class="s1" style="color: #dd1144">'')'</span><span class="p" style="color: #333333">;</span> |
will be used with f the as ts.p.postData.searchField which is the name of the corresponding field instead of the index. So searching will not work too.
Because of many possible other parts of the code I decided to suggest pragmatical and simple workaround: to modify the lines of code of addJSONData by adding the lines (see “else if” part)
1 2 3 4 5 6 7 8 9 10 |
<span class="kwd" style="color: #00008b">if</span><span class="pun">(</span><span class="pln">locdata </span><span class="pun">||</span><span class="pln"> ts</span><span class="pun">.</span><span class="pln">p</span><span class="pun">.</span><span class="pln">treeGrid</span><span class="pun">===</span><span class="kwd" style="color: #00008b">true</span><span class="pun">)</span><span class="pun">{<br /> </span><span class="pln"> rd</span><span class="pun">[</span><span class="pln">locid</span><span class="pun">]</span><span class="pun">=</span><span class="pln"> $</span><span class="pun">.</span><span class="pln">jgrid</span><span class="pun">.</span><span class="pln">stripPref</span><span class="pun">(</span><span class="pln">ts</span><span class="pun">.</span><span class="pln">p</span><span class="pun">.</span><span class="pln">idPrefix</span><span class="pun">,</span><span class="pln"> idr</span><span class="pun">);<br /> </span><span class="pln"> ts</span><span class="pun">.</span><span class="pln">p</span><span class="pun">.</span><span class="pln">data</span><span class="pun">.</span><span class="pln">push</span><span class="pun">(</span><span class="pln">rd</span><span class="pun">);<br /> </span><span class="pln"> ts</span><span class="pun">.</span><span class="pln">p</span><span class="pun">.</span><span class="pln">_index</span><span class="pun">[</span><span class="pln">rd</span><span class="pun">[</span><span class="pln">locid</span><span class="pun">]]</span><span class="pun">=</span><span class="pln"> ts</span><span class="pun">.</span><span class="pln">p</span><span class="pun">.</span><span class="pln">data</span><span class="pun">.</span><span class="pln">length</span><span class="pun">-</span><span class="lit" style="color: #800000">1</span><span class="pun">;<br /> </span><span class="pun">} </span><strong><span class="kwd" style="color: #00008b">else </span><span class="kwd" style="color: #00008b">if</span><span class="pun">(</span><span class="pln">ts</span><span class="pun">.</span><span class="pln">p</span><span class="pun">.</span><span class="pln">datatype </span><span class="pun">===</span><span class="str" style="color: #800000">"local"</span><span class="pun">&&</span><span class="pln"> dReader</span><span class="pun">.</span><span class="pln">repeatitems</span><span class="pun">)</span><span class="pun">{<br /> </span><span class="kwd" style="color: #00008b"> var</span><span class="pln"> idStripted </span><span class="pun">=</span><span class="pln"> $</span><span class="pun">.</span><span class="pln">jgrid</span><span class="pun">.</span><span class="pln">stripPref</span><span class="pun">(</span><span class="pln">ts</span><span class="pun">.</span><span class="pln">p</span><span class="pun">.</span><span class="pln">idPrefix</span><span class="pun">,</span><span class="pln"> idr</span><span class="pun">),</span><span class="pln"> iData </span><span class="pun">=</span><span class="pln"> ts</span><span class="pun">.</span><span class="pln">p</span><span class="pun">.</span><span class="pln">_index</span><span class="pun">[</span><span class="pln">idStripted</span><span class="pun">];<br /> </span><span class="kwd" style="color: #00008b"> if</span><span class="pun">(</span><span class="pln">iData </span><span class="pun">!==</span><span class="kwd" style="color: #00008b">undefined</span><span class="pun">&&</span><span class="pln"> ts</span><span class="pun">.</span><span class="pln">p</span><span class="pun">.</span><span class="pln">data </span><span class="pun">!=</span><span class="kwd" style="color: #00008b">null</span><span class="pun">&&</span><span class="pln"> ts</span><span class="pun">.</span><span class="pln">p</span><span class="pun">.</span><span class="pln">data</span><span class="pun">[</span><span class="pln">iData</span><span class="pun">]</span><span class="pun">!=</span><span class="kwd" style="color: #00008b">null</span><span class="pun">)</span><span class="pun">{<br /> </span><span class="pln"> $</span><span class="pun">.</span><span class="pln">extend</span><span class="pun">(</span><span class="kwd" style="color: #00008b">true</span><span class="pun">,</span><span class="pln"> ts</span><span class="pun">.</span><span class="pln">p</span><span class="pun">.</span><span class="pln">data</span><span class="pun">[</span><span class="pln">iData</span><span class="pun">],</span><span class="pln"> rd</span><span class="pun">);<br /> </span><span class="pun"> }<br /> </span></strong><span class="pun"><strong>}</strong></span> |
1 |
I think that close changes could be required in <span style="color: #333333"><strong>addXmlData</strong> (see <a href="https://github.com/tonytomov/jqGrid/blob/v4.6.0/js/grid.base.js#L1354-L1358" rel="nofollow">here</a>). </span><br /> |
Copyright 2014 TriRand LtdAll Rights ReservedRSS
Back to Top