Цикличное выполнение через XML с jQuery

Я обычно определяю сначала интерфейс (чтобы быть считанным), который общедоступен, затем защищенный, тогда частный материал. Теперь, во многих случаях я делаю шаг вперед и (если я могу обработать его), используют шаблон PIMPL, полностью скрывая весь частный материал от интерфейса реального класса.

class Example1 {
public:
   void publicOperation();
private:
   void privateOperation1_();
   void privateOperation2_();

   Type1 data1_;
   Type2 data2_;
};
// example 2 header:
class Example2 {
   class Impl;
public:
   void publicOperation();
private:
   std::auto_ptr<Example2Impl> impl_;
};
// example2 cpp:
class Example2::Impl
{
public:
   void privateOperation1();
   void privateOperation2();
private: // or public if Example2 needs access, or private + friendship:
   Type1 data1_;
   Type2 data2_;
};

можно заметить, что я снабжаю постфиксом частный (и также защищенный) участники с подчеркиванием. Версия PIMPL имеет внутренний класс, для которого внешний мир даже не видит операции. Это сохраняет интерфейс класса абсолютно чистым: только реальный интерфейс представлен. Никакая потребность спорить о порядке.

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

6
задан dove 15 October 2009 в 18:13
поделиться

3 ответа

Рекурсивные функции хорошо подходят для этого. Когда вы создаете функцию, которая создает и использует внутреннее рекурсивное замыкание, вы можете обернуть все это в аккуратный небольшой пакет:

    $.get(tocURL, function(toc) {
    function makeToc($xml) {
        // variable to accumulate markup
        var markup = "";
        // worker function local to makeToc
        function processXml() {
            markup += "<li><a href='" + $(this).attr("url") + "'>" + $(this).attr("title") + "</a>";
            if (this.nodeName == "BOOK") {
                markup += "<ul>";
                // recurse on book children
                $(this).find("page").each(processXml);
                markup += "</ul>";
            }
            markup += "</li>";
        }
        // call worker function on all children
        $xml.children().each(processXml);
        return markup;
    }
    var tocOutput = makeToc($(toc));
    $("#list").html(tocOutput);
});
9
ответ дан 9 December 2019 в 20:45
поделиться

You can use

$(el).children().length which would return '0' or a positive number, then loop through if it's a positive number which evaluates to true. You could also use a while loop to do this recursively, and re-set the reference handler however I'm not quite sure that would work out because your nodeNames for each subsequent child differ ( or do they? ) .. What's the most nested example you can provide?

1
ответ дан 9 December 2019 в 20:45
поделиться

Большое спасибо, Кейт, это был билет - ну почти, мне пришлось сделать одно НЕБОЛЬШОЕ изменение, и оно сработало отлично!

Мой код ниже.

$tocOutput="";
$.get(tocURL,function(toc){
 function makeToc($xml) {
  // worker function local to makeToc
  function processXml() {
   console.log($(this));
   $tocOutput += "<li><a href='" + $(this).attr("url") + "'>" + $(this).attr("title") + "</a>";
   if (this.nodeName == "BOOK") {
    $tocOutput += "<ul>";
    // recurse on book children
    $(this).children().each(processXml);
    $tocOutput += "</ul>";
   }
   $tocOutput += "</li>";
  }
  // call worker function on all children
  $xml.children().each(processXml);
 }
 var tocOutput = makeToc($(toc));
 $("#toc").html($tocOutput);
 completed($("#toc"));
});

Вы заметьте, все, что я делаю, это объявляю переменную вне $. get () , а затем я использую $ xml.children (). each (processXml); вместо $ (this) .find ("страница"). each (processXml); что у вас было.

Причина в том, что дети могли быть страницами ИЛИ книгами, но у вас было ограничение только страницами.

Еще раз спасибо!

1
ответ дан 9 December 2019 в 20:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: