2010-09-30 173 views
1

创建完成后,我的父组件执行一个“init”函数,该函数只是在子组件中设置公共可绑定变量。我希望子组件观察这些变量并在设置后使用它们。但是,由于某种原因,ChangeWatcher并没有在变量发生变化时触发。以下是我的代码;任何人看到有什么问题?谢谢。ChangeWatcher未触发绑定属性更改

父组件

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

子组件 - “用户信息”

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

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

回答

2

你说:

在创作完成我的父组件执行的“初始化“功能简单地公开子组件中的可绑定变量。我希望子组件观察这些变量并在设置后使用它们。

它打破封装,试图让子组件访问父项。父母可以接触孩子,但孩子不应该接触父母。但是,任何给定的组件都应该知道它的值何时发生更改并相应地进行更新。使用get/set属性和Flex组件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; 
} 
} 
+0

@Flextras:感谢您的解释。你的建议完全达到了我之后的目标。但是,为什么第一种方法比第一种更好呢? – tommac 2010-10-01 17:52:51

+0

@tommac第二种方法更好,因为它允许您同时协调不同的属性更改,并合并实现更改的代码。这个简单的例子中的需求并不明显。但是,如果我采取更复杂的组件,例如Flextras日历,我可以更好地演示。三个属性控制显示哪个月:displayedMonth,displayedDate和displayedYear。所有更改时都执行类似的代码。通过使用组件lifeCycle,如果有人连续更改全部3个组件,则组件只更新一次而不是三次。合理? – JeffryHouser 2010-10-01 19:32:43

+0

@Flextras:从你的例子中,我概念地理解了使用第二种方法的区别和好处。这样说,我很好奇,看到它的实施。你知道我在哪里可以找到一个示例实现? – tommac 2010-10-01 23:34:02

相关问题