0

剣道グリッドのイベントでコールバックを取得しようとしています。私の同僚は、MVC ヘルパーを使用してグリッドの作成を既に開始しています。だから私はこのようにグリッドにバインドしようとしています:

Html.Kendo().Grid<DetailViewModel>()
        .Name("details")
        .Events(events => events.DataBound(@<text>function () {
                                            $('input:checkbox.details-checkbox').click(function () {
                console.log("checked");
                handleChecked();
             });
           }</text>))

ドキュメントを見ると、なぜここで @ タグを使用する必要があるのか​​ わかりません。「handleChecked」のように、コールバックの名前を入力するだけでよいと思いました。それは私にとってはうまくいきません。なので@タグで囲みました。したがって、現在のセットアップ方法では、「チェック済み」のテキストがコンソールに表示されます。ただし、実際には、チェックボックスがヒットしたときにメソッドが呼び出されるようにしたいと考えています。面倒になるので、その関数ブロックに入れる必要はありません。だから私がやろうとしたのは、ドキュメントの準備ができて、handleChecked を定義することです。次のようになります。

@{
Html.Telerik().ScriptRegistrar()
    .Scripts(wa => wa.AddSharedGroup(@Url.AssetName(AssetGroups.SinglePageApps)))
    .OnDocumentReady(
        @<text>
             $(document).ready(function () {

                          function handleChecked() {
                console.log("handle checked");
             }
             console.log("document.ready");
             });

         </text>);
}

そのため、実行してチェックボックスをクリックしようとすると、handleChecked() is undefined が表示されます。したがって、グリッドにデータが入力された後、剣道グリッドの行にバインドする最良の方法は何なのかわかりません。現在、サーバー側でレンダリングされており、関数コールバックを DataBound イベントに配置しようとしていますが、いくつかの問題があります。何かご意見は?前もって感謝します。

4

1 に答える 1

2

思い通りに動作しない大きな問題は、JavaScript 関数を DOMReady 関数でラップしていることです。

JavaScript では、関数がスコープを定義します。つまり、別の関数内で定義された変数または関数は、外側の関数にのみ存在します。

例えば:


function foo(){
  function bar(){ console.log("bar"); }
  bar();
}

foo(); // => logs "bar" to the console
bar(); // fails; bar is undefined / not a function

これの最後で呼び出すfoo()と、foo 関数はネストされたbar関数を定義し、それを呼び出します。bar()しかし、その後呼び出すと、失敗します。これは、関数bar内にのみ存在するためです。関数が終了するとfoo()すぐに、スコープ外になり、使用できなくなります。foobar

handleCheckedそのため、関数を DOMReady 関数内にラップしたくありません。代わりに、アプリケーション全体からアクセスできる場所にその関数を配置する必要があります。

今のところ物事を単純にするために、関数を Razor ページの<script>タグに直接配置することをお勧めします。

<script type="javascript">
  function handleChecked(){
    // ... do stuff here ...
  }
</script>

これに関して Razor 構文を使用する必要はありません。これは、ページに埋め込まれた通常の HTML と JavaScript です。

これを取得したら、「handleChecked」関数名をevents.DataBound関数呼び出しに直接指定できます。


  // ...
  .Events(events => events.DataBound("handleChecked"))
  // ...

ページのどこからでも関数を使用できるようになったので、「DataBound」イベントが発生したときに関数が見つかります。

それが役立つことを願っています。

于 2013-04-26T20:38:10.167 に答える