2009-05-29 30 views
22

我有一個包含我想綁定到表單元素的十幾個字段的對象,這樣我可以使用該對象將數據發送回服務器進行保存。我的容器對象的Flex警告:無法綁定到類'對象'上的屬性'foo'(類不是IEventDispatcher)

定義:

private static const emptyLink:Object = { 
    id: -1, title:'', 
    trigger1:'',trigger2:'',trigger3:'',trigger4:'',trigger5:'', 
    linkTitle:'', linkBody:'', 
    answer1:'',answer2:'',answer3:'',answer4:'',answer5:'' 
}; 

[Bindable] public var currentLink:Object = emptyLink; 

currentLink在運行時從一個ArrayCollection分配給特定的指數,我只是用emptyLink對象初始化目的居多。

<mx:Panel id="triggerPanel" title="Trigger" width="33%"> 
    <mx:VBox id="tpBoxes" width="100%" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5"> 
     <mx:TextInput id="trigger1" width="100%" textAlign="left" text="{currentLink.trigger1}" /> 
     <mx:TextInput id="trigger2" width="100%" textAlign="left" text="{currentLink.trigger2}" /> 
     <mx:TextInput id="trigger3" width="100%" textAlign="left" text="{currentLink.trigger3}" /> 
     <mx:TextInput id="trigger4" width="100%" textAlign="left" text="{currentLink.trigger4}" /> 
     <mx:TextInput id="trigger5" width="100%" textAlign="left" text="{currentLink.trigger5}" /> 
    </mx:VBox> 
</mx:Panel> 

當然,這個編譯並顯示就好了,但也有對每個實例運行時警告:

警告:無法綁定到屬性上的類「對象」「TRIGGER1」(類不是IEventDispatcher) 警告:無法綁定到'Object'類的屬性'trigger2'(類不是IEventDispatcher) 警告:無法綁定到'Object'類的屬性'trigger3'(類不是IEventDispatcher) 警告:無法綁定到'Object'類的屬性'trigger4'(類不是IEventDispatcher) 警告:無法綁定到屬性「trigger5」階級「對象」(類不是一個IEventDispatcher,請)

而當TextInput字段轉變不更新currentLink對象。

顯而易見的答案是我的對象需要是實現IEventDispatcher的類的實例。這個答案沒有告訴我的是實現這個接口的細節(需要什麼?什麼不是?),如果有一個更簡單的方法來做到這一點 - 就像一個內置的類,它會很樂意接受我的自定義屬性並允許對於綁定,我不必擔心實現界面的細節。

這樣的班是否存在?如果沒有,完成這項任務的最低標準和/或接受標準是多少?

回答

15

您需要使用ObjectProxy(作爲阿赫亞提到) - 但你還需要使用valueCommit讓你在輸入BACK進入你的對象文本:

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:Script> 
     <![CDATA[ 
      import mx.utils.ObjectProxy; 
       private static const emptyLink:Object = { 
    id: -1, title:'', 
    trigger1:'',trigger2:'',trigger3:'',trigger4:'',trigger5:'', 
    linkTitle:'', linkBody:'', 
    answer1:'',answer2:'',answer3:'',answer4:'',answer5:'' 
}; 

[Bindable] public var currentLink:ObjectProxy = new ObjectProxy(emptyLink); 


private function handleClick():void 
{ 
    trace(currentLink.trigger1); 
} 
]]> 
</mx:Script> 

<mx:Panel id="triggerPanel" title="Trigger" width="33%"> 
     <mx:VBox id="tpBoxes" width="100%" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5"> 
       <mx:TextInput id="trigger1" width="100%" textAlign="left" text="{currentLink.trigger1}" valueCommit="{currentLink.trigger1 = trigger1.text;}"/> 

       <mx:Button label="Click" click="handleClick()"/> 
     </mx:VBox> 
</mx:Panel>   

</mx:WindowedApplication> 
0

我沒有使用Flex很長時間,這可能不符合您的要求,但爲什麼不使用XML?我相信您可以將TextInput文本值設置爲XML中的屬性。

我使用僞代碼,但這樣的事情對我來說很有意義:

[Bindable] private static const currentLink:XML = <root> 
                <trigger1 value=""/> 
                <trigger2 value="" /> 
                </root>; 
... 
<mx:TextInput id="trigger1" width ... text="{[email protected]}" /> 

這樣的事情,也許?

8

Object不派遣活動。儘管您已經創建了變量Bindable,但變量currentLink所引用的對象的屬性無法綁定。

改爲使用ObjectProxy

[Bindable] public var currentLink:ObjectProxy = new ObjectProxy(emptyLink); 
1

Here's the livedocs reference爲接口。這幾乎是顯而易見的。

報價:

一般來說,對於一個用戶定義的類能夠調度事件的最簡單方法是擴展EventDispatcher。

因此,

私人靜態常量emptyLink:此事件= {

+0

你的鏈接不會進入你認爲它所做的livedocs內的頁面。每個livedocs參考頁面在其頁腳中都有一個「當前鏈接:...」,其中包含用於直接鏈接正在查看的頁面的URL。使用它。 :) – 2009-06-02 00:54:46

4

你要知道的第一件事是,在Flex 3的結合是不是雙向的。綁定表達式將確保如果綁定表達式(currentLink.trigger1)的源發生更改,則目標(TextInput)將接收相應更改的通知並進行更新。如果你想綁定在另一個方向走,至少有兩種方法可以做到這一點:

  1. 使用MX:綁定標籤直接TextInput.text回對象
  2. 使用BindingUtils做這是編程方式。

在Flex 4中它們被引入一個新的語法雙向綁定@ {} some.binding.expression但它不提供的Flex 3

在第2部分:錯誤正在接收是因爲你綁定了一個「通用」的原型對象。將[Bindable]元數據標記應用於屬性或類時,MXMLC編譯器會生成AS代碼,其中包括使用綁定實用程序和屬性更改觀察器確保綁定發生。但是,由於它是內置的,因此無法使原型對象執行此操作。您可以創建可綁定的自定義ActionScript類(或者具有可綁定的某些屬性)。 MXMLC編譯器將生成一個實現IEventDispatcher的類,因此支持綁定。這具有比原型對象更快的優點,並且還提供了編譯時檢查的功能,例如,如果引用無效屬性,將會收到編譯器錯誤。

另一種替代方法是將您的原型作爲其他SO成員之一所建議的ObjectProxy包裝。

+0

如果我可以接受2個答案,這個將是#2。我選擇了Gabriel's,因爲這是我嘗試做的最簡單的解決方案。儘管感謝所有的信息! – 2009-06-01 13:26:04

1

在一般情況下,你之所以得到「無法綁定到屬性foo上的一個類,因爲你要麼丟失了一個獲取或設置富氏。您可以也使FOO範圍限定於公共變量,(雖然這打破封裝)

所以你需要這兩個使它消失:

public function set foo (o:FooObject) : void { 
... 
} 

public function get foo() : FooObject { 
... 
} 
2

只是關於如何找出更大項目中的違規代碼的提示 - 在兩個斷點上放置一個斷點

trace("warning: unable to bind to property '" 

SDK的PropertyWatcher類中的行(導航>打開類型> ...)。然後Stacktrace將幫助您找到保存已損壞綁定的UI組件。

相關問題