ChangeWatcher未在绑定属性更改时触发

时间:2010-09-30 15:33:26

标签: flex actionscript-3

在创建完成时,我的父组件执行“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 个答案:

答案 0 :(得分:2)

你说:

  

在创建完成时,我的父组件执行“init”函数,该函数只是在子组件中设置公共可绑定变量。我希望子组件能够观察这些变量并在设置时使用它们。

它打破了封装,试图让子组件访问父组件。父母可以接触孩子,但孩子不应该接触父母。但是,任何给定的组件都应该知道它的值何时更改并相应地更新自身。使用get / set属性和Flex Component LifeCycle是正确的方法。

当您创建组件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;
 }
}