2009-02-23 68 views
2

我有一個帶有表單的MXML,裏面有兩個TextInputs。我討厭任何一塊的MXML文件內代碼(I來自一個JavaScript形成),所以我使用從外部AS訪問MXML中定義的元素

mx:Script source="external.as" 

標籤包括以任何MXML文件中使用的任何代碼。問題是,如果我對external.as文件驗證碼:

private function populateFromForm():void{ 
    var vo:ValidObject= new ValidObject(); 
    vo.market = marketInput.text; 
    vo.segment = segmentInput.text; 
    vo.priceLow = priceLowInput.text; 
    vo.priceHigh = priceHighInput.text; 
} 

凡marketInput,segmentInput,priceLowInput和priceHighInput是在MXML文件中定義TextInputs。當我嘗試請編譯我得到一個1120:訪問未定義的屬性XXXXX

我曾嘗試加入之前函數此行:

public var marketInput:TextInput; 
public var segmentInput:TextInput; 
public var priceLowInput:TextInput; 
public var priceHighInput:TextInput; 

而是我得到一個1151:一個存在衝突命名空間內部中的定義XXXX非常合理。

有沒有辦法做到這一點,而不必將所有輸入引用作爲參數傳遞給函數?

+0

你可以張貼MXML文件? – mmattax 2009-02-23 17:20:08

回答

3

做一個 「代碼隱藏」 是痛苦的Flex中。在Javascript中沒有部分類的概念或原型繼承的靈活性。 Google爲許多資源提供了「flex-code-behind」功能。

我認爲你最好習慣於在mxml中嵌入代碼的想法。儘可能使用避免內聯代碼的腳本標籤。如果您必須在MXML中編寫大量代碼,也許您可​​能希望將代碼重新分配到多個自定義組件中。獎勵積分,如果它們是可重複使用的。

+0

非常感謝,我只是。 我只是不同意這個「痛苦」的形容詞,我發現它實際上很乾淨,很容易理解(你通常所說的那種東西)「它很明顯,我不相信我沒有找到它我自己!「) – Chepech 2010-04-09 18:55:12

0

您的mxml文件中是否有腳本標記指向您的ActionScript文件?

 

<mx:Script source='includes/foo.as' /> 
 
+0

是的,我在MXML文件中有腳本引用。 – Chepech 2009-02-26 16:50:10

5

您需要創建到TextInputs'父容器的一個實例的引用,然後使用該參考_1的存取的TextInputs及其屬性。我認爲我們需要澄清一下你的文件結構。你如何創建父容器的實例?我想這就是你需要做什麼:

MyForm.mxml:

<?xml version="1.0" encoding="utf-8"?> 
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"> 
    <mx:TextInput id="marketInput" /> 
    <mx:TextInput id="segmentInput" /> 
    <mx:TextInput id="priceLowInput" /> 
    <mx:TextInput id="priceHighInput" /> 
</mx:VBox> 

SaveVOContainer.as:

package 
{ 
    public class SaveVoContainer extends Container 
    { 
     private var myForm:MyForm = new MyForm(); 

     public function SaveVOContainer 
     { 
      this.addChild(myForm); 
     } 

     private function populateFromForm():void{ 
      var vo:ValidObject= new ValidObject(); 
      vo.market = myForm.marketInput.text; 
      vo.segment = myForm.segmentInput.text; 
      vo.priceLow = myForm.priceLowInput.text; 
      vo.priceHigh = myForm.priceHighInput.text; 
     } 
    } 
} 
2

在Flex中執行代碼隱藏的規範方式是通過繼承。以下是文檔中的一個很好的解釋:http://learn.adobe.com/wiki/display/Flex/Code+Behind。簡而言之:

  1. 聲明一個ActionScript類用作基類。
  2. 將基類設置爲MXML文件中的根容器。
  3. 對於在MXML文件中聲明的任何控件,必須使用完全相同的名稱將它們重新聲明爲基類的公共成員(完全如上面對使用源標記的腳本塊所做的那樣,只有它可以工作:-)

所以,你的ActionScript文件:

package mypackage 
{ 
    import mx.controls.TextInput; 

    public class myClass extends WindowedApplication 
    { 
     public var marketInput:TextInput; 

     private function populateFromForm():void{ 
      /* As above */ 
     } 
    } 
} 

以及相應的MXML文件:

<?xml version="1.0" encoding="utf-8"?> 
<custom:myClass xmlns:custom="mypackage.*" 
     xmlns:fx="http://ns.adobe.com/mxml/2009" 
     xmlns:s="library://ns.adobe.com/flex/spark" 
     xmlns:mx="library://ns.adobe.com/flex/mx"> 
    <mx:TextInput id="marketInput"/> 
</custom:myClass> 

等等爲你的其他特xtInput控件。現在你的populateFromForm函數應該可以工作。

有兩次必須重新聲明相同的實體有點令人髮指,但它並不完全是早期受訪者所做的傷害包(儘管這可能會在Flex 4中發生變化,使其不那麼痛苦是)。

1
  • 在.AS此導入:

    import mx.core.Application;

  • 在.AS使用:

    mx.core.Application.application.component.property = value; mx.core.Application.application.myText.text = 'test';