AS3- addeventListener를 사용하여 변수의 값 변경을 감지 할 수 있습니까?
-
08-07-2019 - |
문제
EventListener를 사용하여 변수를 듣고 변수의 값이 변경 될 때를 감지 할 수 있습니까? 감사.
해결책
모든 것을 수업으로 감싸면 매우 쉽습니다. Getter/Setter 메소드를 사용할 것입니다. 세터 메소드는 호출 될 때마다 발송 및 이벤트가 발송됩니다.
(참고 : 세터와 게터는 속성처럼 취급됩니다). 메소드를 호출하는 대신 값을 할당합니다 (예 : someVar = 5
대신에 someVar(5);
세터 / getter가 함수 / 방법이지만 속성처럼 취급됩니다.
//The document class
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.EventDispatcher;
public Class TestDocClass extends Sprite
{
private var _model:Model;
public function TestDocClass():void
{
_model = new Model();
_model.addEventListener(Model.VALUE_CHANGED, onModelChanged);
}
private function onModelChanged(e:Event):void
{
trace('The value changed');
}
}
}
//The model that holds the data (variables, etc) and dispatches events. Save in same folder as DOC Class;
package
{
import flash.events.Event;
import flash.events.EventDispatcher;
public class Model extends EventDispatcher
{
public static const VALUE_CHANGED:String = 'value_changed';
private var _someVar:someVarType;
public function Model():void
{
trace('The model was instantiated.');
}
public function set someVariable(newVal:someVarType):void
{
_someVar = newVal;
this.dispatchEvent(new Event(Model.VALUE_CHANGED));
}
}
}
다른 팁
@BrianHodge : 실제로 예제를 어떻게 사용합니까? 설정 함수를 어떻게 호출합니까? 당신은 그것을 어떻게 언급합니까? 변수를 어디에 전달할 수 있습니까 ..?
예를 들어 버튼 클릭으로 랩핑 된 변수를 변경하려면 가정 해 보겠습니다. 다른 코드와 예제 (getter/setter) 유형을 시도했다고 고백해야합니다. dispatchEvent
또는없이, 나는 그것을 극복 할 수 없습니다! 그러나 당신의 모범은 내가 필요로하는 것 같습니다. 단지 그것을 작동시킬 수는 없습니다.
나는 얻는다 The model was instantiated
기능을 문서 클래스로 설정하면 그게 다야.
나는 마침내이 파견 된 일로 시간을 잃고있는 나 같은 사람들을 위해 알게되었습니다!
내 경우에는 _someVar
변수는 데이터를 입력해야합니다 String
(같은 것 fornewVal
).
OnceTestDocClass
문서 클래스로 설정됩니다. 다음과 같이 인스턴스화 된 모델을 참조하십시오.
_model.someVariable="new stuff";
나는 다음과 같은 값을 바꾸려고 노력했다.
_model.someVariable("new stuff");
당신은 약간의 추적 동작을 추가 할 수 있습니다 Model
출력 패널에 명확한 데모가있는 클래스 :
package
{
import flash.events.Event;
import flash.events.EventDispatcher;
public class Model extends EventDispatcher
{
public static const VALUE_CHANGED:String = 'value_changed';
private var _someVar:String = "default";
public function Model():void
{
trace('The model was instantiated.');
}
public function set someVariable(newVal:String):void
{
trace ("before " + _someVar);
_someVar = newVal;
trace ("after " + _someVar);
this.dispatchEvent(new Event(Model.VALUE_CHANGED));
}
}
}
그다지 많지는 않지만 이런 것들은 일부 사람들에게 많은 시간을 할애 할 수 있습니다 =)
AS2에서 Object.Watch를 사용하여 비슷한 일을 할 수있었습니다. 나는 직접적인 동등한 것을 보지 못하지만 mx.binding.utils.ChangeWatcher 바인딩 가능한 변수에 대해 유사한 기능을 제공합니다.
구별 할 수없는 변수의 경우 AS3에서 수행하는 방법을 모르지만, 시청하려는 변수가 바인딩 가능하다면 (또는 이항으로 수정할 수 있다면) ChangeWatcher가 원하는 것을 줄 수 있습니다.