Диспетчеризация событий: наследует ли слушатель свойства вызывающего? - PullRequest
1 голос
/ 05 января 2010

Я заметил в actionScript 3, что когда вызывается обработчик, он получает доступ к свойствам отправителей. Если я отправлю событие из моего пользовательского класса. Могут ли все слушатели наследовать все мои публичные свойства и методы?

Ответы [ 2 ]

1 голос
/ 05 января 2010

Слушатель не наследует значения, он может получить ссылку на объект, отправивший событие, используя свойство event.target, или ссылку на объект, с которым был зарегистрирован слушатель события, event.currentTarget свойство. Таким образом, вы можете получить доступ к открытым свойствам объекта, отправившего событие, используя ссылку, полученную из свойства target/currentTarget события.

function someFunction():void
{
  //abc is local variable and inaccessible outside someFunction
  var abc:ABC = new ABC();
  abc.prop = "someValue";
  abc.addEventListener(Event.TYPE, handleEvent);
}
function handleEvent(e:Event):void
{
  //get a reference to the object that was declared
  //in someFunction using the event.currentTarget.
  var abc:ABC = ABC(e.currentTarget);
  trace(abc.prop);//traces someValue
}

//some where in the ABC class:
this.dispatchEvent(new Event(Event.TYPE));

Если вам интересно, свойства event.target и event.currentTarget могут отличаться. Добавьте прослушиватель события click к спрайту и щелкните текстовое поле внутри спрайта (которое является его дочерним элементом) и проверьте значения target и currentTarget. Цель будет текстовым полем, а текущая цель - самим спрайтом.

1 голос
/ 05 января 2010

Если ваш метод-обработчик определен в том же классе, что и диспетчерский вызов, вы можете получить доступ к свойствам, так как они находятся в области видимости. Обычно это не так - если вы, например, добавляете обработчик события к событию «щелчок» кнопки, то у вас есть доступ к свойствам кнопки только через ссылку на эту кнопку (например, event.target). Если вы более знакомы с JS или AS2, то я понимаю, почему вы сбиты с толку - в JS и AS2 свойства объекта редко входят в область действия метода (вам всегда нужно использовать «this», например, для доступа к свойствам экземпляра). ).

class Foo extends EventDispatcher {
    public var myProperty: int;
    function thisMethodIsDispatchingEvents() {
        addEventListener("fooEvent", handleFooEvent);
        dispatchEvent(new Event("fooEvent"));
    }
    function handleFooEvent(event: Event) {
        // "myProperty" can be accessed because "handleFooEvent" 
        // is declared in Foo, not because handleFooEvent is an event handler
        trace(myProperty); // Works
    }
}

// in an unrelated class Bar:
class Bar {
    private var _foo: Foo;
    function bar() {
        _foo = new Foo();
        _foo.addEventListener("fooEvent", handleFooEvent);
    }
    function handleFooEvent(event: Event) {
        // "myProperty" can not be accessed directly, only though
        // a reference to a Foo object.
        trace(myProperty); // Fails
        trace(_foo.myProperty); // Works
        trace(event.target.myProperty); // Works
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...