1

私はjsに関してはかなり初心者ですが、今日は私が本当に理解していないjsに出くわしたので、やりたいと思います。光を当てていただけませんか?剣道が関わっていますが、問題はプレーンなjsです。

ネストされたグリッドがあります。各行は他のグリッドに展開でき、このグリッドのそれぞれに独自のデータソースがあります。ユーザーがクリックすると、以下の方法でデータソースにデータソースを1つずつ入力しますが、create呼び出しから非同期応答を受信したときに、データソースに読み取りを強制する際に問題が発生しました。(読み取りを呼び出すことはかなり間違ったことですが、剣道には独自のバグがあります-ここでは重要ではありません。)私の問題は、read()を呼び出すインスタンスがなかったということでした。メソッドはデータソースを返し、それをグリッドに割り当てるだけです。イベントが戻ったときに、正しいものを取得できるものへの参照が見つかりません。からのデータソースインスタンス。これは、ここでは別のコンテキストです。

これを解決するために、データソースを構築するメソッドにデータソース変数を追加し、データソースの代わりに変数を返します。これは同じことです。ただし、これは問題のあるread()を呼び出すための何かを持っているのに役立ちます。ここで、createハンドラーで、init中にメソッドで返す変数に対してcreateを呼び出します。それはうまくいきますが、すべてのデータソースがinitの後に独自のインスタンスでreadを呼び出しているかどうかはわかりませんか?

function _getDatasource() {
        var datasource = new kendo.data.DataSource({
            transport: {
                read: {
                    url: serviceBaseUrl + "ReadQuestionnaire",
                    dataType: "json",
                    type: "POST",
                    contentType: "application/json; charset=utf-8",

                },               
               create: {
                    url: serviceBaseUrl + "CreateQuestionnaire",
                    dataType: "json",
                    type: "POST",
                    contentType: "application/json; charset=utf-8",
                    complete: function (jqXhr, textStatus) {
                        if (CheckForExceptions(jqXhr, textStatus) == false) {
                            // this is the variable I am not sure about 
                            // after innit does this always refers to this same datasource ?
                            datasource.read(); 
                        }
                    }
                }
            }
        });
        return datasource;
}
4

1 に答える 1

3

あなたの解決策は正しいです、そしてそうです、datasource.read()呼び出しはそれぞれの場合に正しいデータソースオブジェクトです。

これが機能する理由は次のとおりです。クロージャ。

クロージャとは、ネストされた関数からアクセス可能な1つの関数で変数を宣言する機能です。または、より正確な説明については、ウィキペディアのページを参照してください:http: //en.wikipedia.org/wiki/Closure_(computer_science)

非常に簡単な例を次に示します。


function doStuff(){
  var name = "Derick";

  function sayMyName(){
    console.log(name);
  }

  sayMyName();
}

doStuff();

この例でnameは、関数内で変数を宣言していdoStuffます。次に、最初の関数の中に別の関数をネストしています。関数は、クロージャを使用しsayMyNameて変数にアクセスしています。name

を呼び出すdoStuff()と、変数が定義され、値に割り当てられます。次に、sayMyName関数が定義され、その変数が使用されます。次に電話sayMyName()をかけると、名前がコンソールに記録されます。

同様に、コードでは、のインスタンスに割り当てられる変数を作成していますDataSource。後で、completeコールバックの関数を定義します。データソースがロードされ、コールバックが発生した後、その変数の周りのクロージャを使用して、DataSourceインスタンスに割り当てたcompleteのと同じ変数にアクセスします。dataSource

var dataSourceを呼び出すたびに宣言しているので_getDataSource、新しいDataSourceインスタンスに割り当てられた新しい変数/参照を作成しています。ただし、関数の下部に配置する必要はないと思いますreturn datasource...少なくとも、completeコールバック関数が機能するためには必要ありません。たぶん、この関数以外の何かのためにそれが必要ですか?

JavaScriptでのクロージャの詳細については、以下をご覧ください。

https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures

JavaScriptクロージャはどのように機能しますか?

http://www.javascriptkit.com/javatutors/closures.shtml

http://www.watchmecode.net/javascript-scope(有料のスクリーンキャスト)

HTH

于 2013-01-29T16:23:22.317 に答える