konto usunięte

Temat: dynamiczne tworzenie metod w klasie

Witam,

Mam taki kod:



// modify node methods
$.each(this.data.node_data, $.proxy(function(name, value) {

// is a function and is not a protected function
if ($.isFunction(value) && name.substr(0, 1) !== "_") {

this.node.prototype[name] = function() {

var event_before = new $.Event("before.node.btree");
var result;
var args = Array.prototype.slice.call(arguments);

// trigers a "before.node.btree" event
result = $.btree.data.container.triggerHandler(event_before, {
"method_name" : name,
"instance" : this,
"args" : args
});

// if propagation stopped
if (result === false)
return;

// if triggered event returns a value
if (typeof result !== "undefined") {
// then we are changing args passed to a proper node method
args = result;
}

// extend and call node method
result = value.apply(
$.extend(this, {
_callback : function (data) {
$.btree.data.container.triggerHandler( name + '.node.btree', {"instance" : this, "args" : args, "data" : data});
}
}), args);

return result;
}
} else {
// is a protected method or var
this.node.prototype[name] = value;
}
}, this));



zaraz na poczatku "this.data.node_data" to zwykły obiekt {} dwuwymiarowy, gdzie "kluczami" sa nazwy zmiennych lub funcji a wartosciami null w przypadku zmiennych lub funkcjami w przypadku metod. "this.node" to przyszla instancja klasy reprezentujaca lisc w drzewie i do prototypu tej klasy przypisujemy rzeczy z this.data.node_data.

teraz miejsce gdzie jest "result = value.apply... i tam extend. jest tworzona dynamicznie metoda "_callback" a dynamicznie dlatego, zeby nie wpisywac w normalnych metodach klasy "this.node" jakiego trigera ma uruchomic - "before.node.btree" lub np. "load.node.btree" czy nie przekazywac znowu recznie parametrow do trigera itp.

to wszystko dziala jak nalezy ALE. jak wywolam metode ta rozszerzona, ktora zawiera _callback() i w niej gdzies pod drodze wewnatrz klasy "this.node" znowu wywolam taka rozszerzona metode to nie wszystkie dodane funkcje "_callback" (i co za tym idzie triggery) sie uruchamiaja. a uruchamiaja sie tylko te ostatnie.

ten opisany problem znika, kiedy w value.apply zrobie kopie "this" czyli instancji klasy "this.node" tylko ze wtedy wlasnie na na kopii sa wykonywane wewnetrzne jakies operacje nic nie dziala tak jak nalezy.

odkrylem, ze jesli dziala na kopii to wtedy ta dodana funkcja "_callback" nie jest tak jakby nadpisywana.

jest na to jakis sposob aby zachowac taka funkcjonalnosc (rozszerzanie funkcji) i jednoczesnie sprawic zeby dzialalo takze w w/w przypadku?Michał Baniowski edytował(a) ten post dnia 17.10.11 o godzinie 18:51