2017-12-27 11 views
3

私は非同期呼び出しを行う関数を持っています&は成功時に無名関数を呼び出します。data無名関数のパラメータはサーバからの応答を収集するために使用されますが、 paramとして渡されない限り、内部関数。内部関数を渡さずに外部関数のパラメータにアクセスする

callService('POST', getDataInfo, detailData, function (data) { 
      formDisplayGrid('.accruedGrid', '.accruedTable', 'Total Accrued');//doesn't work. 
      formDisplayGrid(data,'.accruedGrid', '.accruedTable', 'Total Accrued'); //works 
      }); 

は、単にjQuery ajaxを使用して呼び出しを行う関数です。

function callService(method, url, data, success) { 
     var ajaxObject = { 
      url: url, 
      method: method, 
      dataType: 'json', 
      success: success 
     } 
     if (method == 'POST') { 
      ajaxObject['data'] = data; 
     } 
     jQuery.ajax(ajaxObject); 
    } 

formDisplayGrid機能セットを超えるだけ反復するHTMLテーブルを形成します。

function formDisplayGrid(data, modalSelector, mainGridSelector, totalLabel) {  
    jQuery(modalSelector).modal(); 
    if (typeof data != 'undefined' && data.Code === 200) { 
     var mainGrid = jQuery(mainGridSelector); 
     var tbody = ''; 

     jQuery.each(data['Data']['category'], function (k, v) { 
      //some code here. 
      jQuery.each(v['subcat'], function (k, v) { 
       //some code here. 
      });  
     });  
       //some code here. 
     mainGrid.find('tbody').html(tbody).fadeIn(1200); 
    } 
} 

匿名関数が でjQuery.ajax機能を実行されていると無名関数を直接callService関数の内部で実行された場合、それが利用されているはずですので、これが起こっているということですか?

+1

また、フォームの表示グリッド関数のコードを共有してください – orangespark

+0

@orangespark updated –

+0

私はあなたの関数をモジュール化し、それらを切り離すので、引数としてデータを渡すアプローチが良いと思います。純粋な関数を書く方が良い方法です。 – orangespark

答えて

1

概念は基本的にシンプルで、あなたのformDisplayGrid()関数は、それがプライベート変数へのアクセスを持つべきではありませんので、機能をコールバックへの外部関数でありますそのコールバック関数内で関数を定義する必要があります。

+0

関数本体は内部にネストされていて、別の場所には書き込まれていない必要があります。 –

+0

私はそれを最後の行で述べました:) – orangespark

0

あなたのformDisplayGrid関数は、それらの変数がグローバルであるかクロージャ内にない限り、呼び出された場所からの変数にアクセスすることはできません。

EDIT:あなたの関数は、data引数を別の場所から取得する必要があります。それ以外の場合は、どのようなデータが分かるのでしょうか。第二のものだけが働くのは正当な理由があります。

EDIT2:ここにクロージャとソリューションです:

callService('POST', getDataInfo, detailData, function (data) { 
    function formDisplayGrid(modalSelector, mainGridSelector, totalLabel) { 
     // you no longer need the data variable  
     jQuery(modalSelector).modal(); 
     if (typeof data != 'undefined' && data.Code === 200) { 
      var mainGrid = jQuery(mainGridSelector); 
      var tbody = ''; 

      jQuery.each(data['Data']['category'], function (k, v) { 
      //some code here. 
       jQuery.each(v['subcat'], function (k, v) { 
       //some code here. 
       });  
      });  
       //some code here. 
      mainGrid.find('tbody').html(tbody).fadeIn(1200); 
     } 
    } 
    formDisplayGrid('.accruedGrid', '.accruedTable', 'Total Accrued');//should work. 
}); 
+0

私は、無名関数がクロージャを形成し、パラメタ 'data'がクロージャの法則に従ってformDisplayGrid関数内で自動的に利用可能になると期待していました。 –

+1

formDisplayGridの関数定義はコールバック関数の中にあるべきです – orangespark

+0

@orangesparkつまり、内部関数は、本体がネストされていて名前で呼び出されていない場合にのみ 'data'へのアクセスを取得するでしょうか? –

関連する問題