Альтернативы глобальным переменным? - PullRequest
1 голос
/ 19 января 2012

Я пытаюсь обдумать альтернативы для глобальных переменных.

Речь идет о том, где мне нужно найти значения в одном XML и сравнить с другим XML (или более). Поскольку XML JQuery сам по себе является функцией, а операции под ним являются функциями внутри функции (тьфу), я не могу получить значение из двух глубоких функций и использовать его глобально.

Так что в настоящее время я не могу получить значение XML из 1 файла и использовать его для фильтрации другого файла XML, и здесь мне нужна помощь.

Мне передали 3 файла XML.

Файл 1 - category.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>
      <Name>Name 1</Name>
      <City>City</City>
      <State>ST</State>
</OA>

и так далее ...

Файл 3 = EP.xml - содержит значения каждой записи EP Скопировать код

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

Теперь, что я думал, что мог сделать, когда начал, так это позволить пользователю выбрать категорию, и на основе этого выбора вернуть 2 таблицы, содержащие значения, которые сопоставлены с этой категорией.

Моя проблема в том, что когда JQuery начинает анализировать XML, он делает это в функции (во всех примерах, которые я видел), поэтому я понятия не имею, как установить переменную внутри одной функции и использовать ее внутри следующей используемой функции. открыть 2-й файл или 3-й.

Вот что у меня сейчас: Скопировать код

<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

ЛЮБЫЙ СОВЕТ был бы очень признателен - я даже не смог рассмотреть операцию сравнения b / c вопроса переменной.

Есть ли способ сравнить 2 файла XML, и я просто пропускаю его, или вы можете порекомендовать решение с использованием какого-либо временного местоположения?

1 Ответ

1 голос
/ 20 января 2012

Итак, воспользовавшись предложением @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>

Таким образом, внутри обработчика ajax вызова *1005* * * вы выполняете второй ajax вызов, как предложил @Kevin B. Вы можете передать ему дополнительные данные, поместив вызов функции в ваш обработчик успеха. И я передам данные, которые нужны второму вызову вложенной функции (внутри getCategoriesSuccess) при первом вызове, чтобы он был доступен для второго вызова. Вот почему я передаю OAid в первом вызове вложенной функции, потому что это необходимо внутри getOASuccess.

Я уверен, что есть и другие способы сделать это, но это дает вам некоторую гибкость с вашими обработчиками успеха.

Надеюсь, это поможет. Дайте мне знать, если есть дополнительные вопросы, и я обновлю свой ответ соответственно. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...