2012-01-19 25 views
1

私はグローバル変数の代わりに頭を抱えています。グローバル変数の代わりに?

ケースは、1つのXMLで値を見つけて別のXML(またはそれ以上)と比較する必要があるケースです。 XML JQuery自体は関数であり、その下の演算は関数内部の関数です(ugh).2つの関数から値を取得して全体的に使用することはできません。

私は現在、1つのファイルからXML値を取得し、別のXMLファイルをフィルタリングすることはできません。それは助けが必要な場所です。

私は3つのXMLファイルを手渡しました。

ファイル1 - categories.xmlは - カテゴリ 元...

<CAT> 
     <OA1>True</OA1> 
     <OA2>False</OA2> 
     <OA3>True</OA3> 
     <EP1>True</EP1> 
     <EP2>False</EP2> 
     <EP3>False</EP3> 
</CAT> 

ファイル2 = oa.xmlのマッピングが含まれています - 各OA記録 元の値が含まれています...

<OA> 
     <Name>Name 1</Name> 
     <City>City</City> 
     <State>ST</State> 
</OA> 

のように...

ファイルは3 = EP.xml - 目が含まれています各EPレコードのE値は ソースコードのコピー

<EP> 
     <object 1></object1> 
     <object 2></object2> 
     <object 3></object3> 
</EP> 

は今、私は私が始めたとき、私は何ができると思ったことは、ユーザがカテゴリを選択できるようにし、その選択戻ったときにその値を含む2つのテーブルをベースそのカテゴリにマッピングされます。

私の問題は、JQueryがXMLの解析を開始するときに、関数内で(それは私が見たすべての例で)それを行うので、変数を1つの関数内に設定して次の関数2番目のファイルを開くために使用されます。ここで

は、私が今持っているものです: ソースコードのコピー

<script> 
     var catid = ""; // I thought this, being outside of the function would be a global varaible 
     OA1 = ""; // I tried it with and without var in front 
     var OAid = ""; 
     $(document).ready(function(){ //When opening an XML we do it in a function 
     $.ajax({ 
      type: "GET", 
      url: "xml/categories.xml", 
      dataType: "xml", 
      success: function(xml) { 
       $(xml).find('Cat').each(function(){ 
               //Next 2 rows don't matter b/c I can't use their values outside 
               //of the function 
        var catid = $(this).find('Catid').text(); 
        var OA1 = $(this).find('OA1').text(); 

        $('<div class="page-wrap"></div>').html('<table><tr><td>' + catid +'</td><td>OA1 '+ OA1 +'</td></tr></table></div>').appendTo('#page-wrap'); 

       }); 
     } 
     }); 
     }); 
//The only way I know how to open up the next XML, start all over again 
     $(document).ready(function(){ 
     $.ajax({ 
      type: "GET", 
      url: "xml/OA.xml", 
      dataType: "xml", 
      success: function(xml) { 
       $(xml).find('OAData').each(function(){ 
        var OAid = $(this).find('OAid').text(); 
        $('<div class="page-wrap"></div>').html('<table><tr><td>OA ID is '+ OAid +'</td></tr></table></div>').appendTo('#page-wrap'); 

       }); 
      } 
      }); 
     }); 
</script> 
//Somebody shoot me 

ANYアドバイスが最も高く評価されるだろう - 私もB/C変数問題の比較操作を考慮することができていません。

2つのXMLファイルを比較する方法はありますか?それとも不足していますか、または一時的な場所を使用して解決策をお勧めできますか?

+0

2つ目の '$ .ajax'を最初のコールバックの中に移動するだけで、2つの変数にアクセスできます。 –

+0

グローバル変数の代わりに、data()メソッドhttp://api.jquery.com/jQuery.data/をお勧めします。 – Johan

答えて

1

@Kevin Bの提案をして少し強化すると、それらの関数を別々の関数に因数分解すると、異なる成功ハンドラ関数に値を簡単に渡すことができます。 @Kevin Bが提案されているよう

<script> 
     var catid = ""; // I thought this, being outside of the function would be a global varaible 
     OA1 = ""; // I tried it with and without var in front 
     var OAid = ""; 
     $(document).ready(function(){ //When opening an XML we do it in a function 
     $.ajax({ 
      type: "GET", 
      url: "xml/categories.xml", 
      dataType: "xml", 
      success: function(xml) { 
       $(xml).find('Cat').each(function(){ 
               //Next 2 rows don't matter b/c I can't use their values outside 
               //of the function 
        var catid = $(this).find('Catid').text(); 
        var OA1 = $(this).find('OA1').text(); 

        $('<div class="page-wrap"></div>').html('<table><tr><td>' + catid +'</td><td>OA1 '+ OA1 +'</td></tr></table></div>').appendTo('#page-wrap'); 

       }); 
       $.ajax({ 
       type: "GET", 
       url: "xml/OA.xml", 
       dataType: "xml", 
       success: function(xml) { getCategoriesSuccess(xml, catid, OA1, OAid); } 
       }); 
      } 
     }); 
     }); 

     function getCategoriesSuccess(xml, catid, OA1, OAid) { 
     $(xml).find('Cat').each(function(){ 
             //Next 2 rows don't matter b/c I can't use their values outside 
             //of the function 
      var catid = $(this).find('Catid').text(); 
      var OA1 = $(this).find('OA1').text(); 

      $('<div class="page-wrap"></div>').html('<table><tr><td>' + catid +'</td><td>OA1 '+ OA1 +'</td></tr></table></div>').appendTo('#page-wrap'); 

     }); 
     $.ajax({ 
      type: "GET", 
      url: "xml/OA.xml", 
      dataType: "xml", 
      success: function(xml) { getOASuccess(xml, OAid); } 
      }); 
     });   
     } 

     function getOASuccess(xml, OAid){ 
     $(xml).find('OAData').each(function(){ 
      var OAid = $(this).find('OAid').text(); 
      $('<div class="page-wrap"></div>').html('<table><tr><td>OA ID is '+ OAid +'</td></tr></table></div>').appendTo('#page-wrap'); 
     }); 
     } 
</script> 

は、だからあなたの$(document).ready()ajaxコールのsuccessハンドラ内で、あなたは二ajax電話をかけます。成功ハンドラの中で関数呼び出しをラップすることによって、これに追加のデータを渡すことができます。そして、2番目の呼び出しで使用できるように、最初の呼び出しで2番目の入れ子関数呼び出し(getCategoriesSuccess)が必要なデータを渡します。だからこそ、私はgetOASuccessの中で必要とされるので、最初のネストされた関数呼び出しでOAidを渡すのです。

これを行う方法はほかにもありますが、これはあなたの成功ハンドラに柔軟性をもたらします。

こちらがお役に立てば幸いです。追加の質問がある場合は教えてくださいと私はそれに応じて私の答えを更新します。がんばろう!

関連する問題