flex資料繫結陷阱:常見的誤用和錯誤
當構建flex或者adobe air程式時,將乙個物件的值自動的傳遞給另乙個物件這種處理是資料繫結最常 用並最有用的特徵之一。
儘管如此,同時資料繫結會減緩程式的初始化,並且當開發者不是完全理解資料繫結的機制是如何工作的話,會引 起一些開發者意想不到的問題。
最好的解決方法及是確保你正確的使用了它並且在只有需要它的時候才使用它。在這篇文章中,我整理了十條開發者在構建應用使用資料繫結時常見的陷阱和錯誤。
第一條:
難以發現的無聲錯誤
這有些繫結操作似乎已經工作,但是你最後卻沮喪的發現沒有並且無從下手修改的例子。
在繫結表示式或者在繫結框架裡呼叫繫結方法時丟擲的異常和錯誤,只會默默的捕 獲。因此你將在flash player除錯版本中看不到任何執行時錯誤。不僅繫結沒有工作,
而且沒有任何錯誤顯示。為什麼這些錯誤被無聲捕獲?
**實現繫結機制,在繫結發生前需要幾個先決條件。繫結 機制會吞噬掉任何錯誤以防止在執行時丟擲執行時異常。
如果你不希望在你的程式中看到這些可能出現的意外錯誤,這是乙個很好的事情。
思考下下面的簡單繫結例子:
<?xml version="1.0" encoding="utf-8"?>
xmlns:s="library:"
xmlns:mx="library:"
minwidth="1024" minheight="768"
preinitialize="handlepreinitialize()">
[bindable]
private var xml:xml=
eladelrom
1 wall street
;
protected function handlepreinitialize():void
]]>
複製**
我已經新增了xml變數繫結到label元件。這些**會執行的很好;但是,我在元件預初始化時 將xml變數設定為null。
這個事件將在元件初始化序列開始之前被派發,此時label 元件還沒有被設定。這個xml變數被設定為null,因此沒有name屬性在xml物件上。
如果你執行這個程式,你會發現繫結沒有發生也沒有提示任何錯誤。
除錯繫結
圖1. xml物件的值被設定為null
另一種方法更加直觀,是使用bindingmanager類的debugbinding方法。
你設定你想觀察的元件和屬性,然後你就可以看到**獲的錯誤。
在上面的示例**中,我給下面的這行**加了注釋:
bindingmanager.debugbinding("label.text");
複製**
把這行的注釋去掉並在debug模式下執行它;你將 在控制台看到繫結錯誤(見圖2)
圖2.控制台輸出的繫結錯誤
看一下binding.as和bindingmanager.as類的**。**中含有許多的try...catch表示式來確保形成有效繫結的條件。
以下有一些在繫結時可能丟擲的錯誤型別:
* error #1006: call attempted on an object that is not a function.
* error #1009: null has no properties.
* error #1010: undefined has no properties.
* error #1055: has no properties.
* error #1069: property - not found on - and there is no default value
*錯誤#1006:試圖呼叫的物件不是函式。
*錯誤#1009:空沒有屬性。
*錯誤#1010:未定義沒有屬性。
*錯誤#1055:沒有屬性。
*錯誤#1069:屬性 - 找不到 - 並且沒有預設值
如果任何這些錯誤發生,繫結物件將默默捕獲他們並不再實現繫結。
你可以使用繫結管理的除錯選項來看到這些錯誤。
繫結管理除了捕獲這些錯誤之外還捕獲其他的錯誤。
Flex資料繫結陷阱 二
嘗試繫結乙個沒有包含ipropertychangenotifier介面的類 實現ipropertychangenotifier介面的類,必須在類改變屬性時派發事件並且任何巢狀類必須作為公共屬性被 因此,你能發現類裡的屬性何時改變了。例如,讓我們來看一下uicomponent類的簽名 見圖3 uico...
Flex 資料繫結
package mxml private var sum int 0 bindable private var task task new task fx script bindable public function get sum int public function set sum valu...
Flex 資料繫結
package mxml private var sum int 0 bindable private var task task new task fx script bindable public function get sum int public function set sum valu...