AS3- addeventListener를 사용하여 변수의 값 변경을 감지 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/306896

  •  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가 원하는 것을 줄 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top