ChangeWatcher не запускается при изменении привязанного свойства - PullRequest
1 голос
/ 30 сентября 2010

По завершении создания мой родительский компонент выполняет функцию «init», которая просто устанавливает общедоступные привязываемые переменные в дочерних компонентах.Я хотел бы, чтобы дочерние компоненты наблюдали за этими переменными и после установки использовали их.Однако по какой-то причине ChangeWatcher не запускается с изменением переменной.Ниже мой код;кто-нибудь видит что не так?Спасибо.

Родительский компонент

private function init():void
{
 userInfo.user = new User("Tom");
}

Дочерний компонент - "userInfo"

...
[Bindable] public var user:Object;

private function init():void
{
  ChangeWatcher.watch(this, "user", function(evt:PropertyChangeEvent):void
  {
    Alert.show(evt.property);
  }
}

1 Ответ

2 голосов
/ 30 сентября 2010

Вы сказали:

По завершении создания мой родительский компонент выполняет функцию «init», которая просто устанавливает общедоступные привязываемые переменные в дочерних компонентах. Я бы хотел, чтобы дочерние компоненты наблюдали за этими переменными и после установки использовали их.

Он нарушает инкапсуляцию, пытаясь получить доступ дочернего компонента к родительскому. Родители могут получить доступ, дети, но дети никогда не должны иметь доступ к родителям. Тем не менее, любой данный компонент должен знать, когда его значения изменяются, и обновляться соответствующим образом. Использование свойств get / set и компонента LifeCycle Flex является правильным способом сделать это.

Когда вы делаете компонент Bindable, это означает, что его можно использовать как источник привязки данных. Мне кажется, что вы пытаетесь использовать упомянутые свойства в качестве цели для привязки данных и пытаетесь обновить свой компонент.

Если я понимаю, что вы ищете, я бы вообще не использовал ChangeWatcher. Просто разверните свое пользовательское свойство в свойство get / set и внесите свои изменения в метод set свойства или, возможно, в commitProperties, используя флаг.

Примерно так:

private var _user : Object;
[Bindable]
public function get user():Object{
 return this._user;
}

public function set user(value:Object):void{
 this._user = value;
 Alert.show(value);
}

Или даже лучше:

protected var userChanged : Boolean = false;
private var _user : Object;
[Bindable]
public function get user():Object{
 return this._user;
}
public function set user(value:Object):void{
 this._user = value;
 this.inalidateProperties()
 userChanged = true;
}

public function commitProperties():void{
 if(userChanged == true){
   Alert.show(value);
   userChanged = false;
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...