2010-03-30 81 views
0

我不確定是否誤解了Flex中的綁定。我正在使用Cairngorm框架。我有如下代碼組件:遇到綁定問題

 [Bindable] 
     var _model:LalModelLocator = LalModelLocator.getInstance(); 
.... 
<s:DataGroup dataProvider="{_model.friendsSearchResults}" 
        includeIn="find" 
        itemRenderer="com.lal.renderers.SingleFriendDisplayRenderer"> 
      <s:layout> 
       <s:TileLayout orientation="columns" requestedColumnCount="2" /> 
      </s:layout>   </s:DataGroup> 
模型中的定位

[Bindable] 
public var friendsSearchResults:ArrayCollection = new ArrayCollection(); 

裏面的項目渲染器有一個按鈕,它調用命令,並且命令結果裏面有像線這個:

model.friendsSearchResults = friendsSearchResults; 

放置斷點,並逐步通過代碼我證實,這就像被調用和friendsSearchResults得到更新。

據我瞭解,如果我更新可綁定變量,它應該自動重新呈現具有該變量的dataProvider的s:DataGroup。

回答

1

代碼示例中沒有任何明顯的錯誤。它應該工作,所以我認爲其他地方存在問題。

我會建議設置一個斷點,其中dataProvider被分配,還有model.friendsSearchResults被分配。確保它們都指向同一個對象實例。然後逐步完成屬性分配和相應的事件。

爲了使調試更容易,您可以切換到使用命名事件而不是默認值。使用命名事件,只有對您的特定屬性感興趣的事件偵聽器纔會被觸發,而不是任何偵聽器正在偵聽任何屬性更改。這更容易調試,運行速度更快。例如,更改:

[Bindable] 
public var results:ArrayCollection; 

[Bindable("resultsChanged")] 
private var _results:ArrayCollection; 
public function get results():ArrayCollection { 
    return _results; 
} 
public function set results(value:ArrayCollection):Void { 
    _results = value; 
    dispatchEvent(new Event("resultsChanged")); 
} 

另一件事要記住的是,綁定隱藏某些錯誤,如空引用例外。他們認爲價值根本不可用,並抑制了錯誤。逐步完成作業和相關綁定將有助於找到這樣的問題。

+0

感謝您的出色洞察力,它幫助我們檢測出問題的來源,例如:var friendsSearchResults:ArrayCollection = model.friendsSearchResults;但是這讓新變量指向同一個變量,所以即使我這樣做了:model.friendsSearchResults = friendsSearchResults;之後它並沒有真正設置模型變量。 – Tam 2010-03-30 04:00:32