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