2009-10-02 7 views
3

mxml 코드에서 추가 값을받을 수있는 구성 요소를 만들려고합니다.플렉스 : 사용자 지정 구성 요소에 매개 변수 전달

public class Board extends Canvas 
{ 
    public var boardSize:Number; 
    private var cellWidth:Number; 
    public function Board() 
    { 
     super(); 

    } 
} 

mxml 코드에서 boardSize 값을 전달하는 방법은 무엇입니까? 예 :

<MyComp:Board x="22" y="25" width="600" height="600" boardSize="19"> 

그러나 작동하지 않습니다. 코드를 디버깅하려고 할 때 해당 boardSize 변수가 NaN 클래스 인 것입니다.

답변

3

테스트시기는 언제입니까? 생성자에 중단 점을 넣어 코드를 테스트하면 boardSize가 null이어야합니다. 코드와 마찬가지로 MXML을 인스턴스화하려면 멤버 변수가 설정되기 전에 생성자가 호출되어야합니다.

예를 들어,이 응용 프로그램은 TestObject 클래스를 사용하여 시도하십시오. 디버그 모드에서 실행하면 추적에서 n과 s가 설정되지 않았 음을 알려주지 만 앱이 표시되면 추적이 발생한 후 두 개의 레이블이 명확하게 바인딩됩니다.

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" xmlns:local="*"> 
    <mx:TraceTarget /> 
    <local:TestObject id="o" n="19" s="19" /> 
    <mx:Label text="Number Field: {o.n}" /> 
    <mx:Label text="String Field: {o.s}" /> 
</mx:Application> 


package 
{ 
    public class TestObject 
    { 
     [Bindable] 
     public var n:Number; 
     [Bindable] 
     public var s:String; 

     public function TestObject() 
     { 
      trace("Initialized test object ...", n, s); 
     } 
    } 
} 
+0

좋은 점이있다 –

+0

예 내가 거기에 중단 점을 넣었으므로 그것이 작동하지 않는 이유는 무엇입니까? 전에 mxml 태그 근처에 중단 점을 설정하면 도움이 될까요? –

+1

아마도 코드를 실행하고 싶습니다. 이 변수가 설정되자 마자 getter와 setter 메소드를 사용하여 처리해야한다. –

0

이 시도 :

<MyComp:Board x="22" y="25" width="600" height="600" boardSize="{Number(19)}"> 

나이 :

<mx:Script> 
<![CDATA[ 
public var boardSize:Number = 19; 
]]> 
</mx:Script> 

<MyComp:Board x="22" y="25" width="600" height="600" boardSize="{boardSize}"> 

문제는 당신이 통과되어있을 수 있습니다 구성 요소에 대한 문자열로, 숫자라는 것을 인식하지 못합니다.

+0

두 가지 모두 시도해 보았습니다. 도움이되지 않았다 : ( –

1

Dan Monego의 답변과 의견을 자세히 설명합니다. 아래의 클래스처럼 보이도록 클래스를 변경하십시오. 그런 다음 set 함수에서 중단 점을 설정할 수 있습니다.

+0

함수 세트 boardSize를 입력해야합니다. void –

0

원하는 속성 위에 [Inspectable] 메타 태그를 추가해야하는 mxml 코드 완성을 얻는다고 생각합니다.

[Inspectable(defaultValue="", type="Number", name="boardSize", format="Number")] 
public var boardSize:Number; 

시도해 보시고 알려주십시오. 이 종류의 구성 요소 개발에 대한 자세한 정보를로드하십시오. here

+0

inspectable 태그 autocomplete가 작동하는 방식을 일부 제어 할 수 있습니다 (예 : 필드를 몇 개의 입력으로 제한). 그러나 모든 공용 속성은 기본적으로 자동 완성으로 표시됩니다. –

0

생성자를 살펴보면 인수가 없으므로 값을 설정하려면 속성 또는 public vars가 필요합니다. 인수로 사용자 지정 구성 요소를 만들려면 아래 나열된 것과 같이 다른 생성자를 만들어야합니다. 이 생각하지 마십시오 ...

public class Board extends Canvas 
{ 
     public var boardSize:Number; 
     private var cellWidth:Number; 
     public function Board(boardSize:Number = 0, cellWidth:Number = 0) 
     { 
       super(); 
       this.boardSize = boardSize; 
       this.cellWidth = cellWidth; 


     } 
} 
0

당신은 아마에 액세스 할 수 있도록하려면 장소 당신이 값을 설정합니다 선택적 매개 변수를 가질 수 MXML에서하지만 ActionScript를 인수로 생성자를 호출 할 수 있습니다 이 속성은 구성 요소를 설정하고 자식을 만드는 동안 발생합니다. "creationComplete"는 이미 완료해야합니다. 이렇게하려면 createChildren() 메서드를 재정의합니다. 또한 변경 사항을 캐치하기 위해 세터를 만들거나 적어도 바인더에 바인드하려고합니다.

예 :

package { 
    import flash.events.Event; 

    public class Board extends Canvas { 

    /** clever ASDoc comment goes here */ 
    [Bindable("boardSizeChanged")] 
    [Inspectable(category="General", defaultValue="")] 
    var _boardSize: Number; 
    public function get boardSize(): Number { 
     return _boardSize; 
    } 
    public function set boardSize(value: Number): void { 
     if (_boardSize == value) return; 
     _boardSize = value; 
     // do something when boardSize changes, e.g. update child components 
     trace("Boardsize is now: " + value); 
     dispatchEvent(new Event("boardSizeChanged")); 
    } 

    public function Board() { 
     super(); 
    } 

    override protected function createChildren(): void { 
     super.createChildren(); 
     // create your own children, using the boardSize property (this uses the getter function) 
     trace("Boardsize: " + boardSize); 
    } 
}} 

이 예제 있다는 점 유의 하시길 바랍니다 설정 boardSize() 이전에 createChildren에라고 - 그래서 당신은 당신의 아이들을 변경할 boardSize를 사용하는 경우는 실제로 이미 존재하는지 확인한다 세터.

관련 문제