mx.utils.Delegate
Delegate adalah class yang disertakan dalam Flash sejak versi 7.2 (mx 2004) yang memungkinkan kita untuk mengubah scope sebuah function . Class ini banyak digunakan dalam event-handling , khususnya untuk menghindari penggunaan anonymous function dan membuat kode kita lebih readable dan maintainable.
Scope
Pertama kita lihat bagaimana scope bekerja dalam Flash/Actionscript. Coba kita lihat kode berikut ini (misalkan di Stage ada sebuah MovieClip bernama myButton:
- var s:String = "String in _root";
- myButton.onRelease = function (){
- trace(this.s);
- };
Saat myButton diklik, outputnya adalah :
undefined
Kenapa outputnya undefined ? Jawabannya adalah karena this di dalam onRelease() callback mengacu pada myButton, bukan _root.
Sekarang lita coba membuat function tersendiri untuk menghandel onRelease event tersebut.
- var s:String = "String in _root";
- myButton.onRelease = handleOnRelease;
- function handleOnRelease(){
- trace(this.s);
- };
Saat myButton diklik, outputnya adalah :
undefined
Kita lihat bahwa walaupun function handleOnRelease ditulis pada level root , outputnya masih _undefined . Hal ini karena scope function tersebut masih tetap sama yaitu myButton.
Untuk mengakses variabel s kita bisa menggunakan relative path yaitu this.parent.s . Tapi hal ini akan menimbulkan masalah jika kita memindahkan myButton, ke dalam MovieClip lain. Kita juga bisa menggunakan _absolute path yaitu _root.s. Masalah akan timbul saat kita memuat (load) swf yang bersangkutan ke dalam swf lain.
Cara terbaik adalah dengan mengubah scope handleOnRelease dengan menggunakan Delegate.
Delegate
Delegate adalah memiliki static method bernama create() yang dapat kita gunakan tanpa perlu membuat instance-nya terlebih dahulu. Yang perlu kita lakukan adalah mengimpor mx.utils.Delegate ke dalam skrip dengan menggunakan keyword import atau dengan menggunakan fully-qualified name . Cara pertama lebih mudah dibaca, jadi ini yang kita pakai.
- import mx.utils.Delegate;
- var s:String = "String in _root";
- myButton.onRelease = Delegate.create(this,handleOnRelease);
- function handleOnRelease(){
- trace(this.s);
- };
Kita lihat baris no 3. this pada argumen Delegate.create() mengacu pada root karena disinilah Delegate digunakan. Jika kita ingin mengakses sebuah variabel di objek lain, misalnya sebuah MovieClip bernama A , maka kita gunakan _Delegate.create(A,…) . Argumen kedua adalah function yang digunakan untuk menghandel onRelease .
Dengan menggunakan Delegate seperti kode di atas, sekarang jika myButton diklik, maka outputnya adalah :
String in _root
Walaupun myButton dipindahkan ke dalam movieclip lain, misalnya movieclip A, kode di atas tetap bekerja seperti yang diharapkan.
- import mx.utils.Delegate;
- var s:String = "String in _root";
- A.myButton.onRelease = Delegate.create(this,handleOnRelease);
- function handleOnRelease(){
- trace(this.s);
- };
Jadi kesimpulannya, Delegate adalah class yang wajib diketahui oleh kita yang bekerja dengan Actionscript.
Demikian, mudah-mudahan bermanfaat.
Commenting is closed for this article.