Autor | Zpráva | ||
---|---|---|---|
Suta Profil |
#1 · Zasláno: 5. 12. 2011, 18:38:12 · Upravil/a: Suta
Mám malý update panel s ikonami (buttony) pro úpravu určitých prvků.Update panel má např. buttony "delete" a "update".
Tento panel je vkládán do stránky na mnoha místech, kliknutí na konkrétní button panelu tedy pokaždé volá jinou metodu a zasílá jiné parametry. // tato metoda je volána mnohokrát insert_element_updatePanel = function ( obj ) { var target, itemId; target = obj.target; // element, do nějž má být update panel vložen itemId = target.zav_fileExplorer_itemId, // element má v sobě uložené unikátní id; updatePanel.add_toElement({element: target}); // nastavení (přepsání) událost click updatePanel.buttons["delete"].onclick = function() { // níže předaným odkazem bude metoda onclick držet kontext metody insert_element_updatePanel // bude-li takovéto přepsání metody onclick provedeno 1000x za sebou, nevím, zda-li nedojde k plýtvání paměti nejaka_metoda_provadejici_odstraneni_prvku ({ target: target, itemId: itemId }); } } Dotaz je vepsán do poznámek v kódu. Díky za případnou radu. |
||
_es Profil |
#2 · Zasláno: 6. 12. 2011, 06:46:00
Suta:
„bude-li takovéto přepsání metody onclick provedeno 1000x za sebou, nevím, zda-li nedojde k plýtvání paměti“ Stačí ti jedna funkcia, ako napríklad tu, nemusíš tých funkcií vytvárať 1 000. |
||
Suta Profil |
#3 · Zasláno: 6. 12. 2011, 13:31:11
_es:
Ano, v 90% používám delegování událostí, kdy podle hodnoty konkrétního atributu elementu při kliknutí nad dokumentem volám patřičnou funkci. Výše uvedený příklad je hodně zjednodušený. Jinak těch funkcí nevytvářím 1000 v jednom okamžiku, ony jsou do jednoho jediného elementu (update panelu) přiřazovány (s přepsáním té předchozí) dynamicky. |
||
_es Profil |
#4 · Zasláno: 6. 12. 2011, 14:17:15
Suta:
„Jinak těch funkcí nevytvářím 1000 v jednom okamžiku“ Ale zato 1 000 postupne - na 12. riadku je vždy vytváraný nový objekt funkcie, zatiaľ čo v tom odkazovanom príspevku je viacnásobne priraďovaný objekt tej istej, len jednej, funkcie. |
||
Suta Profil |
#5 · Zasláno: 6. 12. 2011, 15:02:33 · Upravil/a: Suta
_es:
Sám jsem se zamotal. Ono dojde k vytvoření 1000 funkcí, ale spíše bych řekl, že dojde k vytvoření "stejné" funkce 1000x za sebou. A jelikož je tato funkce vždy přiřazena stejnému objektu (resp. události onclick), měla by být ta předchozí odstraněna, takže aktuálně v paměti by měla být vždy pouze jedna jediná. Dotaz spíše směřoval k onomu kontextu (target a itemId na řádku 17-18), kde si nejsem jistý, zda-li minulá (přepsaná) funkce bude skutečně odstraněna z paměti. |
||
Suta Profil |
#6 · Zasláno: 7. 12. 2011, 00:01:41 · Upravil/a: Suta
Aktuální řešení vypadá následovně. Pokud je něco zcela špatně, budu rád za každou kritiku. Připomínám, že se jedná o vytvořený příklad pro tuto diskuzi, v reálu je update panel vytvářen jako instance třídy.
Univerzální update panel má metodu, která nastaví údaje zasílané metodě callback. updatePanel.set_callback = function( obj ) { this.callback = obj.func; this.params = obj.params; } Na konkrétní buttony update panelu je navázána metoda onclick, volající callback funkci a předávající uložené parametry. buttonHtml.onclick = function() { if(that.callback) { that.callback({ params: that.params, buttonType: buttonType }) } } Při vložení update panelu do stránky (např. při kliknutí na konkrétní záznam/řádek v tabulce) je potřeba vložit update panel do stránky a nastavit potřebné údaje pro použití v metodě callback. updatePanel.add_toElement({element: target}); updatePanel.set_callback({ func: vlastni_metoda_zpracovavajici_akce_podle_typu_buttonu, params: { target: target, itemId: itemId } }) |
||
_es Profil |
#7 · Zasláno: 8. 12. 2011, 21:07:44
Suta:
Nejde to bez premennej that ? Nestačí použiť this ? Potom by stačila len jedna funkcia.
„A jelikož je tato funkce vždy přiřazena stejnému objektu (resp. události onclick), měla by být ta předchozí odstraněna, takže aktuálně v paměti by měla být vždy pouze jedna jediná.“ Mazanie z pamäti nemusí nastať okamžite, teda aj keď k objektu funkcie už prístup možný nie je, tak môže stále obsadzovať pamäť. Ak sa v kóde nachádza ...=function(){... , tak je pri behu JS v tom mieste vytváraný nový objekt funkcie.
|
||
Časová prodleva: 13 dní
|
|||
Suta Profil |
#8 · Zasláno: 21. 12. 2011, 16:00:51 · Upravil/a: Suta
_es:
„Nejde to bez premennej that?“ U přeuložení objektu this nevím co přesně máš na mysli, použití aply nebo call? Používám je zřídka (a ano, v určitých případech mají své opodstatnění), osobně mi však přijde vytvoření lokální proměnné uchovávající kontext přehlednější a na případnou neefektivitu při "zbytečném" vytváření nové proměnné jsem v praxi nenarazil, pouze v teoretické rovině na diskuzích. „Ak sa v kóde nachádza ...=function(){...“ Ano, snažím se minimalizovat jak je to jde. |
||
_es Profil |
#9 · Zasláno: 21. 12. 2011, 16:33:32
Suta:
„U přeuložení objektu this nevím co přesně máš na mysli, použití aply nebo call?“ Napríklad si môžeš niečo uložiť pomocou objekt.vlastnosť=hodnota a potom tú hodnotu prečítať ako this.vlastnosť vo funkcii priradenej do objekt.onclick.
|
||
Časová prodleva: 12 let
|
0