Autor Zpráva
Suta
Profil
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
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
_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
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
_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
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
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.
Suta
Profil
_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
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.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0