Dojo toolkit

Aspektus orientált programozás (dojo/aspect)

Az aspektus lényege, hogy a nélkül értesüljünk bizonyos függvényhívásokról, hogy módosítanunk kellene az eredeti függvények kódját.

require([ "dojo/aspect", "demo/Animal" ], function(aspect, Animal) { var dog = new Animal(4); aspect.after(dog, "eat", function(arg) { console.log("After called with argument: " + arg); }, true); dog.eat('meat'); });

Az első argumentum az objektum, aminek a függvénye érdekel minket, a második a függvény neve, a harmadik pedig az a függvény, amit az eredeti függvény előtt és/vagy után le szeretnénk futtatni (advising function).

aspect.before

A before metódus az eredeti függvény előtt fog lefutni, és az eredeti függvény paramétereit automatikusan megkapja.

aspect.after

Az after metódus az eredeti függvény után fog lefutni. Van egy extra paramétere: receiveArguments, amivel azt szabályozhatjuk, hogy a második függvény az eredeti függvény argumentumait vagy visszatérési értékét kapja meg. Amennyiben visszatérési értéket kapunk, a mi felelősségünk, hogy azzal, vagy egy módosított értékkel visszatérjünk.

aspect.around

Az around metódus megengedi, hogy akkor hívjuk meg az eredeti függvényt, amikor akarjuk:

aspect.around(dog, "talk", function(originalMethod) { return function() { console.log('Before talk'); var result = originalMethod.apply(this, arguments); console.log(result); console.log('After talk'); } });

Mikor is lehet ez hasznos?

Dijit-es widgetek esetén, ha ki szeretnénk bővíteni az alap funkcionalitást, aspektum orientált módon könnyedén megtehetjük:

aspect.after(this.dropdown, "onChange", function(value) { dojo.xhrGet({ url : "/data.php?value=" + value }).then(function(data) { // Do something }); }, true);

A fenti példában, ha a legördülő menü értéke változik egy XHR request-el szerezünk információt a megváltozott értékről, majd az alapján további lépéseket teszünk.