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

Apache flex 在绑定属性更改时未触发ChangeWatcher,apache-flex,actionscript-3,Apache Flex,Actionscript 3,创建完成后,我的父组件执行一个“init”函数,该函数只在子组件中设置公共绑定变量。我想让子组件观察这些变量,并在设置后使用它们。但是,由于某些原因,ChangeWatcher没有随着变量的更改而触发。下面是我的代码;有人知道怎么了吗?谢谢 父组件 private function init():void { userInfo.user = new User("Tom"); } 子组件--“用户信息” 你说: 创建完成后,我的父组件执行一个“init”函数,该函数只在子组件中设置公共绑定变量

创建完成后,我的父组件执行一个“init”函数,该函数只在子组件中设置公共绑定变量。我想让子组件观察这些变量,并在设置后使用它们。但是,由于某些原因,ChangeWatcher没有随着变量的更改而触发。下面是我的代码;有人知道怎么了吗?谢谢

父组件

private function init():void
{
 userInfo.user = new User("Tom");
}
子组件--“用户信息”

你说:

创建完成后,我的父组件执行一个“init”函数,该函数只在子组件中设置公共绑定变量。我想让子组件观察这些变量,并在设置后使用它们

它破坏了封装,试图让子组件访问父组件。父母可以接触孩子,但孩子永远不应该接触父母。但是,任何给定的组件都应该知道其值何时更改并相应地更新自身。使用get/set属性和Flex组件生命周期是实现这一点的正确方法

当您使组件可绑定时,这意味着它可以用作数据绑定的源。在我看来,您似乎正试图使用上述属性作为数据绑定的目标,并且正在努力更新您的组件

如果我明白你的意思,我根本不会使用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;
 }
}

@Flextras:谢谢你的解释。你的建议正是我想要的。但是,为什么第二种方法比第一种更好?@tommac第二种方法更好,因为它允许您同时协调不同的属性更改,并整合代码以实现更改。在这个简单的例子中,需求并不明显。但是,如果我使用更复杂的组件,比如Flextras日历,我可以更好地演示。三个属性控制显示月份:displayedMonth、displayedDate和displayedYear。所有代码在更改时都会执行类似的代码。通过使用组件生命周期,如果有人连续更改了所有3个组件,那么组件只更新一次而不是三次。有意义吗?@Flextras:从你的例子中,我从概念上理解了使用第二种方法的区别和好处。尽管如此,我还是很想看到它的实现。您知道在哪里可以找到示例实现吗?请阅读组件生命周期,然后打开任何Flex Framework组件。完整的来源是可用的。您还可以查看关于创建Flex组件的Flex Show screencast系列,该系列深入讨论了组件的生命周期;这里的屏幕广播非常有用。
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;
 }
}