1

Infragisticsの古いバージョンを使用してUltraWebGridおり、組み込みの JavaScript の一部を置き換える必要があります。コンパイルされた js は、ある種の API として一連の関数をオブジェクト型に追加するように見えます。次のようにフォーマットされます:

var igtbl_ptsBand = ["functionname1",function(){...},"functionname2",function(){...},... 

等々。これをどのようにオーバーライドしますか?

基本的に、コントロールは新しいブラウザーと互換性のない方法でページに html を追加しており、これを行う JavaScript コードは少し調整する必要があります。コードを見つけました...変更する必要があります。

コードはここで見つけることができます

コード例をダンプするための回答を追加しました。この回答は選択しません

同様のSOの質問

4

3 に答える 3

1

あなたが言及した配列は、ある種の関数テーブルのようです。

var igtbl_ptsBand = ["func1", function() { }, "func2", function() { } ]

オーバーライドだけでなく、チェーンを使用することをお勧めします。チェーンを使用すると、独自のコードを挿入できますが、それでも元の関数を呼び出すことができます。「func2」とチェーンを置き換えたいとしましょう。あなたはこのようなことをすることができます:

var origFunc, findex, ix;
if (igtbl_ptsBand.indexOf) {
    // indexOf is supported, use it
    findex = igtbl_ptsBand.indexOf("func2") + 1;
} else {
    // Crippled browser such as IE, no indexOf, use loop
    findex = -1;
    for (ix = 0;  ix < igtbl_ptsBand.length;  ix += 2) {
        if (igtbl_ptsBand[ix] === "func2") {
            findex = ix + 1;
            break;
        }
    }
}
if (findex >= 0) {
    // Found it, chain
    origFunc = igtbl_ptsBand[findex];
    igtbl_ptsBand[findex] = function() {
         // Your new pre-code here
         // Call original func (chain)
         origFunc();
         // Your new post-code here
    };
}

もちろん、origFuncには引数がある場合があります。また、JavaScriptのcall()関数を使用して、「thisポインター」を特定の何かに設定することもできます。

origFunc.call(customThis, arg1, arg2...);

引数が配列内にある場合は、call()の代わりにapply()を使用できます。

于 2012-11-30T16:54:59.020 に答える
1

これを行うことはお勧めしません。サードパーティのライブラリに反対するのではなく、常にサードパーティのライブラリと連携するようにしてください。そうは言っても、これはうまくいくはずです:

igtbl_ptsBand[igtbl_ptsBand.indexOf("functionYouWantToOverwrite") + 1] = function () {
    // your new stuff...
};
于 2012-11-30T16:38:40.403 に答える
0

これが私がやっていることです。これを進捗状況で更新します。

これで問題は解決しました。親の「行」のすべての子オブジェクトに functionarray を適用する必要があったことがわかりました。これを行うために、「Fix Rows」関数にコードを追加しました。このjsファイルで修正している他のブラウザJSエラーに遭遇しているため、分割しました。

これは、.netページに次のように追加したjsファイルです...

    </form>
    <script type="text/javascript" src="../../scripts/BrowserCompat.js"></script>
</body>
</html>

.

Brows_FixUltraWebGrid();

function Brows_FixUltraWebGrid() {
    FixRows();
}

function FixRows() {

    FixGridRows_render();
    for (var i = 0; i < igtbl_ptsRows.length; i += 2)
        igtbl_Rows.prototype[igtbl_ptsRows[i]] = igtbl_ptsRows[i + 1];

}


function FixGridRows_render() {

    var origFunc, findex, ix;
    if (igtbl_ptsRows.indexOf) {
        // indexOf is supported, use it
        findex = igtbl_ptsRows.indexOf("render") + 1;
    } else {
        // Crippled browser such as IE, no indexOf, use loop
        findex = -1;
        for (ix = 0; ix < igtbl_ptsRows.length; ix += 2) {
            if (igtbl_ptsRows[ix] === "render") {
                findex = ix + 1;
                break;
            }
        }
    }
    if (findex >= 0) {
        // Found it, chain
        origFunc = igtbl_ptsRows[findex];
        igtbl_ptsRows[findex] = function() {
            // Your new pre-code here
            // Call original func (chain)
            //origFunc();
            // Your new post-code here
            var strTransform = this.applyXslToNode(this.Node);
            if (strTransform) {
                var anId = (this.AddNewRow ? this.AddNewRow.Id : null);

                //new logic to include tbody if it is not there
                var tadd1 = '';
                var tadd2 = '';
                if (!(/\<tbody\>/.test(strTransform))) {
                    tadd1 = '<tbody>';
                    tadd2 = '</tbody>';
                }
                this.Grid._innerObj.innerHTML =
                    "<table style=\"table-layout:fixed;\">" + tadd1 + strTransform + tadd2 + "</table>";

                //old line
                //this.Grid._innerObj.innerHTML = "<table style=\"table-layout:fixed;\">" + strTransform + "</table>";

                var tbl = this.Element.parentNode;
                igtbl_replaceChild(tbl, this.Grid._innerObj.firstChild.firstChild, this.Element);
                igtbl_fixDOEXml();
                var _b = this.Band;
                var headerDiv = igtbl_getElementById(this.Grid.Id + "_hdiv");
                var footerDiv = igtbl_getElementById(this.Grid.Id + "_fdiv");
                if (this.AddNewRow) {
                    if (_b.Index > 0 || _b.AddNewRowView == 1 && !headerDiv || _b.AddNewRowView == 2 && !footerDiv) {
                        var anr = this.AddNewRow.Element;
                        anr.parentNode.removeChild(anr);
                        if (_b.AddNewRowView == 1 && tbl.tBodies[0].rows.length > 0)
                            tbl.tBodies[0].insertBefore(anr, tbl.tBodies[0].rows[0]);
                        else
                            tbl.tBodies[0].appendChild(anr);
                    }
                    this.AddNewRow.Element = igtbl_getElementById(anId);
                    this.AddNewRow.Element.Object = this.AddNewRow;
                }
                this.Element = tbl.tBodies[0];
                this.Element.Object = this;
                this._setupFilterRow();
                for (var i = 0; i < this.Band.Columns.length; i++) {
                    var column = this.Band.Columns[i];
                    if (column.Selected && column.hasCells()) {
                        var col = this.getColumn(i);
                        if (col)
                            igtbl_selColRI(this.Grid.Id, col, this.Band.Index, i);
                    }
                }
                if (this.ParentRow) {
                    this.ParentRow.ChildRowsCount = this.length;
                    this.ParentRow.VisChildRowsCount = this.length;
                }
            }
            console.log('overridden row render function executed');
        };
    }
}
于 2012-11-30T20:43:51.587 に答える