2

JQGridのカスタムIDをxmlreader構造に渡して、行を一意に識別するためにxmlデータ内のノードの組み合わせをフィードする必要があります。私は現在このバージョンを動作させています

var feedXmlReaderOptions = {
    root: "feed",
    row: "entry",
    repeatitems: false,
    id: "d|clmNum,d|seqNum"
};

これは、clmNumおよびseqNum xmlノードを連結して、行の一意の識別子を作成します。

ちなみに、d | xmlで使用される名前空間を参照しているため、無視してください。この質問には関係ありません。ここでの問題は、後でidを解析できるように、clmNumとseqNumの間に区切り文字が必要なことです。

ajaxRowOptions: {
        beforeSend:...
}

イベント。投稿する必要のあるURLを動的に作成できます。投稿先のURLは、明らかにグリッド行と同じIDをリッスンしているため、接続が表示されます。使用されているCSSセレクターのスタイルを考慮して、私が試したのは、CSS疑似要素でした。これにより、存在しないカスタム要素をセレクターに挿入できます。

d|clmNum:after { content: "_" },d|seqNum
d|clmNum.after('_'),d|seqNum

しかし、機能していません... jQueryセレクターは{について文句を言い、jquery .after()は、.before()と同様に、セレクターがすでに結果を返した後、引数ではなくメソッドとしてインラインで機能するようです。

だから、誰かがこれを行う方法についてのアイデアを持っていますか?xmlの作成中に連結キーを返すという代替手段は機能しません。xmlは私の管理下にありません。

本当にありがとう。serban @ nj、usa

明確にするために追加:私のXMLは次のようになります:

<?xml version="1.0" encoding="utf-8" ?> 
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xml:base="http://localhost:8888/eClaimWS/olddispatch.svc/">
<title type="text">DispatchManualInfo</title> 
<id>http://localhost:8888/eClaimWS/olddispatch.svc/DispatchManualInfo</id> 
<updated>2012-05-21T18:13:44Z</updated> 
<link rel="self" title="DispatchManualInfo" href="DispatchManualInfo" /> 
<entry>
<id>http://localhost:8888/eClaimWS/olddispatch.svc/DispatchManualInfo(clmNum='00C1400J0025',seqNum=1)</id> 
<title type="text" /> 
<updated>2012-05-21T18:13:44Z</updated> 
<author>
<name /> 
</author>
<link rel="edit" title="DispatchManualInfo" href="DispatchManualInfo(clmNum='00C1400J0025',seqNum=1)" /> 
<category term="eClaimDispatchProdModel.DispatchManualInfo" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /> 
<content type="application/xml">
<m:properties>
<d:busPhone /> 
<d:damDesc>cat</d:damDesc> 
<d:vehColor /> 
<d:totLssInd /> 
<d:dispTransCtr m:type="Edm.Int32" m:null="true" /> 
<d:clmntCity /> 
<d:companyCd>01</d:companyCd> 
<d:insZip>07470</d:insZip> 
<d:adjZip>07701 565</d:adjZip> 
<d:vehLocSt>NJ</d:vehLocSt> 
<d:vehMake /> 
<d:lossTypeAbbr>WIND</d:lossTypeAbbr> 
<d:homePhone>201-301-5411</d:homePhone> 
<d:insLstNm>derti</d:insLstNm> 
<d:city>wayne</d:city> 
<d:adjLocalPhone>973-434-2482</d:adjLocalPhone> 
<d:vehVin>UNK99999999999999</d:vehVin> 
<d:adjName>Elaine Maniscalco</d:adjName> 
<d:lstChgUser>Vendor</d:lstChgUser> 
<d:seqNum m:type="Edm.Int32">1</d:seqNum> 
<d:clmNum>00C1400J0025</d:clmNum> 
</m:properties>
</content>
</entry>
......
</feed>

idノードが大きすぎてグリッドのROWIDとしてあらゆる種類の問題を引き起こすため、feed>entry>idを使用してxmlreaderidパラメーターを構成することはできません...必要なのはidノードの短いバージョンです。 00C1400J0025_1のように。clmNumとseqNumもXMLに独立して存在するため、xmlreaderを次のように使用したいと思いました。

id: "d|clmNum:after { content: "_" },d|seqNum" 

そしてそれはうまくいきませんでした。と

id: "d|clmNum,d|seqNum"

rowidは00C1400J00251になり、clmNumは任意の長さである可能性があるため、解析するのに苦労しています。

4

1 に答える 1

0

コールバックを使用して、からの要素の値beforeProcessingを正規化することをお勧めします<id><entry>

<id>http://localhost:8888/eClaimWS/olddispatch.svc/DispatchManualInfo(clmNum='00C1400J0025',seqNum=1)</id>

<id>00C1400J0025_1</id>

これを実装するにはRegEx、たとえばを使用できます。

その後、必要な情報をグリッドに簡単に入力できます。名前空間またはその他の特殊文字を持つ要素から情報を読み取るには、2つの円記号を使用して文字をエスケープできます\\(メタ文字のエスケープについては、こちらの情報を参照してください)。たとえば、要素を読み取るd:adjNameには、を使用できますxmlmap: 'd\\:adjName'。このアプローチは、Webkitブラウザー(Chrome、Safari)を除くすべてのブラウザーで完全に機能します。回避策として、ChromeとSafariで動作するxmlmap: 'd\\:adjName, adjName'ため使用できます。xmlmap: 'adjName'私は個人的にの使用法でより良い方法を見つけますgetElementsByTagNameNS

デモは次のようになります。

ここに画像の説明を入力してください

次のコードがあります

$("#list").jqGrid({
    url: "CustomXmlReader.xml",
    colModel: [
        {name: 'id'}, // optional
        {name: 'updated', formatter: 'date'},
        {name: 'adjName', xmlmap: function (entry) { // 'd\\:adjName, adjName'
                var nodes;
                if (entry.getElementsByTagNameNS) {
                    nodes = entry.getElementsByTagNameNS("http://schemas.microsoft.com/ado/2007/08/dataservices", "adjName");
                } else {
                    // old IE browsers
                    nodes = entry.getElementsByTagName("d:adjName");
                }
                return nodes.length > 0 ? nodes[0].firstChild.nodeValue : "";
            }}
    ],
    gridview: true,
    height: "auto",
    xmlReader: {
        root: "feed",
        row: "entry",
        repeatitems: false,
        id: "id"
    },
    beforeProcessing: function (data) {
        $(data).children("feed").children("entry").each(function () {
            var id = $(this).find(">id"),
                res = /\(clmNum='([0-9A-Z]+)',seqNum=(\d+)\)$/g.exec(id.text());
            id.text(res[1] + "_" + res[2]);
        });
    }
});
于 2012-05-21T21:18:31.800 に答える