2

私は正常に動作しているjqgridを構築しています...グリッド構築

if (jqent.isReq) {
    sbGrid.Append("subGrid: true,");
    sbGrid.Append("subGridRowExpanded: function (subgrid_id, row_id) {");
    sbGrid.Append(" $('#' + subgrid_id).html(renderhtmlforSubgrid(subgrid_id, row_id));},");
}

以下のコードでレンダリングされる te​​xtarea とイメージ コントロールを含むサブグリッドがあります。

function renderhtmlforSubgrid(subgrid_id, row_id) {
    var script = '<div style="margin-left:10px; margin-top:10px; margin-bottom:10px;">';
    script += '<textarea class="txtCommentwatermarkOn" id="txtCommentSection" name="txtCommentSection" rows=2 cols=20>Type your comments here</textarea>';
    script += '<input onclick=\"RenderModalPopup(' + row_id + ',' + subgrid_id + ',this);\" type="image" id="image" src="../../Content/Images/commentIcon.png"/>';
    script += '</div>';

    return script;
}

画像をクリックすると、「RenderModalPopup」関数がトリガーされます

function RenderModalPopup(rowid, tableid, event) {
    var dataFromRow = $('#tblArtifact1').jqGrid('getRowData', rowid);
    var PhaseArtifactId = $('#tblArtifact1').jqGrid('getCell', rowid, 'ID');
    ..........................

すべてが正常に機能しています...問題は、列の値を取得するためにグリッドIDを「tblArtifact1」としてハードコーディングしていることです。これは削除する必要があります。グリッド ID を取得できますか? それを取得するための事前定義されたパラメーター/関数はありますか?

私は立ち往生しています..助けてください。

4

1 に答える 1

3

コールバック関数の内部では、グリッドのDOM(のDOM)に初期化される変数をsubGridRowExpanded使用できます。したがって、で親グリッドを取得できます。中に電話する場合は、使用することをお勧めしますthis<table>idthis.idrenderhtmlforSubgridsubGridRowExpanded

renderhtmlforSubgrid.call(this, subgrid_id, row_id)

それ以外の

renderhtmlforSubgrid(subgrid_id, row_id)

この場合、関数のthis内部はグローバルオブジェクトにrenderhtmlforSubgrid変更されず、有用な情報を保持することができます(idや親グリッドへのjQueryラッパーなど)。windowthisthis.id$(this)

idPrefixIDの重複を防ぐために、サブグリッドでオプションを使用することを検討することをお勧めします(詳細については回答を参照してください)。

さらに、あなたのコードから、あなたはJavaScript開発者よりもC#/C++開発者であることがわかります。私は2年前に同じ問題を抱えていました。JavaScriptには、よく知られている他の言語に近い構造がいくつかありますが、深いセマンティクスは実際には異なります。そのため、JavaScript開発者には、既存の構造を間違った方法で使用する多くの標準的なトラップがあります。

例:名前が大文字で始まる変数、プロパティ、または特に関数は使用しないでください。現在RenderModalPopupPhaseArtifactIdルールを破っています。JavaScriptにはクラスがありませんが、関数を使用して密接な構造を作成できます。関数内で、プロパティをに割り当てることができますthis。このような関数は「クラス」のコンストラクターであり、最初の大文字が必要です。「クラス」のインスタンスを作成するには、を使用する必要がありますnew。たとえばvar now = new Date();

クロージャはJavaScriptの関数の別の例であり、関数のように見えますが、多くの重要な違いがあります。

var renderhtmlforSubgrid = function (subgrid_id, row_id) {...}さらに、関数ステートメント()の代わりに、より多くの無名関数と関数式( )function renderhtmlforSubgrid (subgrid_id, row_id) {...}を使用し、関数本体の最初の行ですべての変数を定義することをお勧めします。JavaScriptには、ほとんどのコンピューター言語のようなブロックレベルの変数宣言がないため、JavaScriptコード内で変数を定義すると、間違ったコードを生成するのは非常に簡単です。

最後のアドバイスは、お気に入りのコンピューター言語で使用していたスタイルとは関係なく、JavaScriptコードにカーニハンとリッチーのコードフォーマットのスタイルを使用することです。これにより、ローカライズが困難な重大なエラーが発生する可能性のある自動セミコロン挿入を防ぐことができます。

于 2012-05-09T11:04:31.300 に答える