2016-02-28 43 views
5

Przyjmijmy następujący kod głupie fragment w Plone 5 szablonu strony:Plone5 Mockup Widgety podoba pat-pickadate nie działa na dynamicznie generowanej zawartości

<input id="foo" class="pat-pickadate" /> 

<input id="bar" /> 

<script type="text/javascript" > 
     $('#bar').click(function() { 
      $('#bar').addClass("pat-pickadate"); 
     }); 
</script> 

dostaniesz dwa wejścia. Pierwszy to ładne wejście kalendarza, a drugi na początku jest pusty. Po kliknięciu drugiego wejścia jego klasa zostanie ustawiona na "pat-pickadate" - podobnie jak pierwsza - ale żaden kalendarz nie zostanie wyrenderowany.

Natknąłem się na to, próbując znaleźć przyczynę, dlaczego moje nakładki jquery-UI wyświetlające dodawanie warstwy i widoki edycji już nie (Plone5) pokazują w ogóle widżety kalendarza.

Czy to zachowanie jest zamierzone? Jeśli tak, jaki jest prawidłowy sposób korzystania z widżetów makiety w formach dynamicznie uzyskiwanych przez wywołania AJAX w programie Plone 5? Czy jest jakiś magiczny komunikat informujący o makiecie maszyny zmiany DOM?

Czytałem, że makieta ma własną technikę nakładki, ale trudno jest przepisać około 600 linii złożonego kodu JS, aby uzyskać prosty widget.

Nie mogłem znaleźć żadnej dokumentacji ani przykładów na ten temat. Czy ktoś może skierować mnie we właściwym kierunku?

+0

Usunąłem odpowiedź, którą edytowaliście na pytanie. Praktyki redakcyjne w programie Stack Overflow polegają na tym, że odpowiedzi powinny być publikowane jako rzeczywiste odpowiedzi, a nie jako edycje na pytania. Zalecam również, aby umieścić istotne części odpowiedzi na SO i polegać na łączu tylko w celu uzyskania dodatkowych informacji. W przeciwnym razie szansa nie jest bez znaczenia, że ​​twoja odpowiedź zostanie źle odebrana. – Louis

Odpowiedz

2

Wzorce są inicjalizowane w czasie ładowania, jeśli DOM zmienia się i zawiera nowe elementy, które mają być renderowane za pomocą wzorca, należy zadzwonić pod numer Registry.scan.

Aby to zrobić, trzeba będzie zmienić skrypt tak:

require([ 
    'jquery', 
    'pat-registry' 
], function($, Registry) { 
    $('#bar').click(function() { 
     $('#bar').addClass("pat-pickadate"); 
     Registry.scan($('#bar')); 
    }); 
}) 

skrypt nie musi być inline, ponieważ nic nie gwarantuje, że jQuery i/lub wymagają już załadowany. Więc umieścić swój kod w oddzielnym pliku JS, i upewnić się, że jest załadowany na stronie za pomocą jednego z tych 2 sposoby:

+0

Dziękuję za szybką odpowiedź! Zmieniłem kod zgodnie z sugestią. Ten kończy się w TypeError: require nie jest funkcją require ([ Gdzie mogę uzyskać odniesienie do żądania od –

+1

Prawo, Twój kod JS nie musi być inline, ponieważ gwarancja, że ​​nic JQuery i/lub wymagać? są już załadowane, więc umieść swój kod w oddzielnym pliku JS i dodaj go jako zasób (lub umieść go również w kompozycji Diazo i załaduj do pliku index.html). – ebrehault

+0

2 sposoby: - wpisz plik z motywem diazo i dodaj tag