2010-09-30 117 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

相關問題