Witam,

Mam taki kod:

  1.  
  2. // modify node methods
  3. $.each(this.data.node_data, $.proxy(function(name, value) {
  4.  
  5. // is a function and is not a protected function
  6. if ($.isFunction(value) && name.substr(0, 1) !== "_") {
  7.  
  8. this.node.prototype[name] = function() {
  9.  
  10. var event_before = new $.Event("before.node.btree");
  11. var result;
  12. var args = Array.prototype.slice.call(arguments);
  13.  
  14. // trigers a "before.node.btree" event
  15. result = $.btree.data.container.triggerHandler(event_before, {
  16. "method_name" : name,
  17. "instance" : this,
  18. "args" : args
  19. });
  20.  
  21. // if propagation stopped
  22. if (result === false)
  23. return;
  24.  
  25. // if triggered event returns a value
  26. if (typeof result !== "undefined") {
  27. // then we are changing args passed to a proper node method
  28. args = result;
  29. }
  30.  
  31. // extend and call node method
  32. result = value.apply(
  33. $.extend(this, {
  34. _callback : function (data) {
  35. $.btree.data.container.triggerHandler( name + '.node.btree', {"instance" : this, "args" : args, "data" : data});
  36. }
  37. }), args);
  38.  
  39. return result;
  40. }
  41. } else {
  42. // is a protected method or var
  43. this.node.prototype[name] = value;
  44. }
  45. }, this));
  46.  


Zaraz na początku "this.data.node_data" to zwykły obiekt {} dwuwymiarowy, gdzie "kluczami" są nazwy zmiennych lub funkcji, a wartościami null w przypadku zmiennych lub funkcjami w przypadku metod. "this.node" to przyszła instancja klasy reprezentująca liść 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, żeby nie wpisywać w normalnych metodach klasy "this.node" jakiego triggera ma uruchomić - "before.node.btree" lub np. "load.node.btree" czy nie przekazywać znowu ręcznie parametrów do triggera itp.

To wszystko działa jak należy ALE. Jak wywołam metodę ta rozszerzona, która zawiera _callback() i w niej gdzieś pod drodze wewnątrz klasy "this.node" znowu wywołam taka rozszerzona metodę to nie wszystkie dodane funkcje "_callback" (i co za tym idzie triggery) się uruchamiają. A uruchamiają się tylko te ostatnie.

Ten opisany problem znika, kiedy w value.apply zrobię kopie "this" czyli instancji klasy "this.node" tylko ze wtedy właśnie na kopii są wykonywane wewnętrzne jakieś operacje i nic nie działa tak jak należy.

Odkryłem, ze jeśli działa na kopii to wtedy ta dodana funkcja "_callback" nie jest tak jakby nadpisywana - dokładnego mechanizmu nie potrafię ogarnać.

Jest na to jakiś sposób aby zachować taką funkcjonalność (rozszerzanie funkcji) i jednocześnie sprawić żeby działało także w w/w przypadku?