NetteForms.js – nefunguje s MooTools

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

Zdravím,
v Nette Framework 2.0-dev (revision f195947 released on 2010–12–16) je v netteForms.js chyba (a koukal jsem se na GitHub, ale chyba pořád není opravena). Projeví se tehdy, když se použije knihovna upravující prototype (asi) Object nebo Array – na řádcích 191 a 192 je následující kód:

<script>
for (var id in rules) {
		var rule = rules[id], op = rule.op.match(/(~)?([^?]+)/);
</script>

Je-li upravený Object (nebo Array).prototype, tak se do id dostanou i hodnoty, které tam vlastně nemají co dělat. Dá se to vyřešit kontrolou hasOwnProperty, ale nevím, jakou má podporu v prohlížečích. Nezkoumal jsem onen soubor nijak detailněji, pravděpodobně se tam stejná chyba bude objevovat vícekrát.

Editoval Matěj Konečný (5. 2. 2011 20:09)

redhead
Člen | 1313
+
0
-

Ono s tím se nedá nic moc dělat, jedině že bys sám přepsal všechny foreache na nějaký MooTools iterator (aspoň Prototype (framework) vlastní má). Není trestné si ten skript upravit.

Edit: viz http://mootools.net/…Types/Object#…

Editoval redhead (5. 2. 2011 20:19)

Matěj Konečný
Člen | 3
+
0
-

Já vím a udělám si to, ale myslím si, že přidání

if(!rules.hasOwnProperty(id))
              continue;

by to mohlo vyřešit, nebo ne?

//EDIT: Teď jsem našel, že IE to asi nepodporuje..

Editoval Matěj Konečný (5. 2. 2011 20:27)

redhead
Člen | 1313
+
0
-

Snažil jsem se něco najít o hasOwnProperty a vypadá to, že by to měli podporovat všechny majoritní prohlížeče (snad i včetně IE6). Ale ruku do ohně za to nedám.

Na druhou stranu se mi moc nelíbí tam ten kód dávat, který, dovolím si říct, 90% lidí nepotřebuje, protože používají jQuery.

Lopata
Člen | 139
+
0
-

hasOwnProperty má podporu dobrou. Není důvod to nepoužívat. Jednodušší přístup ale je

<script>
for (var id in rules) {
	if (rules.hasOwnProperty(id)) {
		var rule = rules[id], op = rule.op.match(/(~)?([^?]+)/);
		// ...
	}
}
</script>

EDIT: předběhnut…

Editoval Lopata (5. 2. 2011 21:12)

Matěj Konečný
Člen | 3
+
0
-

Podle mě by měl být kód pokud možno robustní, ošetřovat všechny možné případy. Což znamená, že bych hasOwnProperty použil – předejde se tím možným chybám a ušetří se plno práce s hledáním příčiny chyby lidem jako já. Kromě toho mám pocit, že se poslední dobou dostává upravování prototype nativních tříd trochu víc do popředí.

Lopata
Člen | 139
+
0
-

redhead napsal(a):
Na druhou stranu se mi moc nelíbí tam ten kód dávat, který, dovolím si říct, 90% lidí nepotřebuje, protože používají jQuery.

Kdyby se při psaní netteForms.js počítalo s jQuery, byl by o notnou část kratší. Navíc s modifikací prototypů může pracovat i programátor, co jQuery používá. Myslím, že pár hasOwnProperty by bylo více v souladu s Nette politikou „nic Vám nenutíme“.

David Grudl
Nette Core | 8228
+
0
-

fixed

(tady je pěkně vidět, jaké je znečišťování globálního prostředí svinstvo)

redhead
Člen | 1313
+
0
-

On by se obecně nikdy neměl prototypovat Object objekt, je to bad practice! Pokud to někdo dělá, je masochista. Většina JS frameworků i zkušených JS programátorů to nedělá. Ale počítám s tím, že script asi musí být blbuvzdorný.