Obnova snippetů s JS prvky

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Landsman
Člen | 152
+
0
-

Ahoj,

používám kdyby replicator a když překreslím snippet, kde je třeba ckeditor, select2 a podobné prvky, které renderuje javascript, tak jsou samozřejmě bez něj.

Jak nejlépe překreslovat tak, aby se mi i tyto prvky v obsahu znovu zinicializovali?

Javascript řeším v zápatí stránky – zabalit to také do snippetu a překreslovat i ten?
Když jsem to tak zkusil, tak křičí nette ajax:

nette.min.js:1 Uncaught Cannot initialize nette-ajax twice.

Jak to řešíte vy?

díky

Editoval Landsman (8. 9. 2016 15:19)

jiri.pudil
Nette Blogger | 1028
+
+1
-

Zpravidla přes extension a ideálně navěsit se přímo na snippets, jako to dělá např. extension pro nette/forms

GEpic
Člen | 562
+
+3
-

Ideálně si nadefinovat JS funkce a ty volat jak v extension tak při načtení stránky klasicky, aby v tom byl pořádek :)

Jan Mikeš
Člen | 771
+
+3
-

Řeším to podobně jako @GEpic:

<script>
$(function(){
	$.nette.ext("initOnAjax", {
		success: function (payload) {
			if (!payload.redirect) {
				jsInit();
			}
		}
	});

	jsInit();
});

function jsInit() {
 // ckeditor
 // fancybox
 // ...
}
</script>

Věci jako click handlery atd, píši tak, aby fungovaly i po ajaxu:

<script>
	$("body").on("click", "a.mySelector", function(e){ ... });
</script>

Editoval Lexi (8. 9. 2016 17:30)

GEpic
Člen | 562
+
0
-

Lexi napsal(a):

Řeším to podobně jako @GEpic:

<script>
$(function(){
	$.nette.ext("initOnAjax", {
		success: function (payload) {
			if (!payload.redirect) {
				jsInit();
			}
		}
	});

	jsInit();
});

function jsInit() {
 // ckeditor
 // fancybox
 // ...
}
</script>

Věci jako click handlery atd, píši tak, aby fungovaly i po ajaxu:

<script>
	$("body").on("click", "a.mySelector", function(e){ ... });
</script>

Jj přesně tak, některé eventy jdou bindnout na ‚body‘, či-li fungují i po překreslení snippetu, např. tooltipy, popovery a podobně.

Karlito
Člen | 18
+
0
-

Zdravím,
chtěl jsem se zeptat, jak by jste řešili načítání celých js. souborů. Načítali to přes js nebo to dali do stránky o úroveň vejš.
Například pokud mám výpis uživatelů user/users a každého můžu editovat pomocí formuláře, který vyjede modal oknem a je načten ajaxem z user/update. Ve formuláři mám datetimepicker. Skript obsluhující datetimepicker by jste načetli např tak:

var url = {$basePath}+"/libs/datetimepicker.js";
	$.getScript( url, function() {
		$('#datepicker').datetimepicker({
			locale: 'cs',
			viewMode: 'days',
			format: 'DD.MM.YYYY'
		})
	});

nebo by jste ho rovnou dali do template user/users a do template user/update by jste dali jen ten spuštěcí script?

$('#datepicker').datetimepicker({
	locale: 'cs',
	viewMode: 'days',
	format: 'DD.MM.YYYY'
})

díky :)