Проблема доступа к вызывающего объекту из метода после Delegate

2 просмотра
Перейти к первому непрочитанному сообщению

Racer

не прочитано,
11 нояб. 2007 г., 11:50:1111.11.2007
– ruFlash
this.item.area.onRelease=Delegate.create(this,this.onItemRelease);

Объектов item может быть много. Необходимо в onItemRelease как-то
добраться до area, которое вызвало событие.

Вроде я когда-то это делал. А может и путаю... Но факт что не
получилось.

silin

не прочитано,
11 нояб. 2007 г., 15:39:3411.11.2007
– ruFlash
если в area повесить на онРелиз метод, передающий ссылку на экземпляр

var onReleaseWithThis:Function;
function onRelease(){
onReleaseWithThis(this);
}

то получится примерно то что ты описываешь

this.item.area.onReleaseWithThis=Delegate.create(this,this.onItemRelease);
function onItemRelease(who){
trace(who);
}


Pirrest

не прочитано,
11 нояб. 2007 г., 16:56:5511.11.2007
– ruF...@googlegroups.com
Приветствую!

Если немного дописать делегат:

public static function create(target:Object, method:Function):Function {
        var params:Array = [];
        for(var i:Number=2; i<arguments.length; i++) {
            params.push(arguments[i]);
        }

        var delegate:Function = function(){
            method.apply(target, arguments.concat(params));
        };
        return delegate;
    }

То можно будет передать параметры в твою функцию:
this.item.area.onRelease = Delegate.create(this, this.onItemRelease, this.item.area);
т.е. скопом функции так и останеться тот класс, который является this в примере, но параметром прийдёт твой объект.

Андрей Скорик

не прочитано,
12 нояб. 2007 г., 01:50:0412.11.2007
– ruF...@googlegroups.com
Да чего его дописывать :)

/* ==================================================================================*/

class org.noregret.utils.Delegate
{
    /**
     * Creates a functions wrapper for the original function so that it runs
     * in the provided context.
     * @parameter obj Context in which to run the function.
     * @paramater func Function to run.
     */
     
     
   static function create(target:Object, func:Function):Function
   {
     var args:Array = arguments.splice(2);
    // trace ("!!!!!!!!!!!!!!!!"+ args)
     var f:Function = function () {
       var params:Array = args.concat(arguments);
       return func.apply (target, params);
     };
     
  
     return f;
   }
  
  
    private var func:Function;
   
   
    function Delegate(f:Function)
    {
        func = f;
    }
   
    function createDelegate(obj:Object):Function
    {
        return create(obj, func);
    }
}

/* ==================================================================================*/

import org.noregret.utils.Delegate ;
...

this.item.area.onRelease=Delegate.create(this, itemReleaseHandler, this.item.area);
...


function itemReleaseHandler ($who) {
    trace ($who);
}

Racer

не прочитано,
13 нояб. 2007 г., 16:12:1513.11.2007
– ruFlash
Спасибо огромный.
Чесно говоря, думал какнть изящно воспользоваться Delegatом не
переписывая и не модифицируя этот класс - это было бы слишком
просто ;). А хочется то еще проще.

Очень понравился метод от Silinа. Отложу его себе в копилочку.

Ответить всем
Отправить сообщение автору
Переслать
0 новых сообщений