외부 AS에서 MXML에 정의 된 요소에 대한 액세스
-
06-09-2019 - |
문제
양식이있는 MXML이 있고 그 안에는 두 개의 텍스트가 있습니다. 나는 mxml 파일 내부에 코드가있는 것이 싫어서 (나는 JavaScript Formation에서 나왔다)
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 파일에 정의 된 텍스트입니다. 내가 준수하려고 할 때 나는 얻는다 1120 : 정의되지 않은 속성 XXXXX에 대한 액세스
기능 전에이 줄을 추가하려고 시도했습니다.
public var marketInput:TextInput;
public var segmentInput:TextInput;
public var priceLowInput:TextInput;
public var priceHighInput:TextInput;
그러나 대신 나는 얻는다 1151 : 네임 스페이스 내부의 정의 XXXX와의 충돌이 존재합니다. 완벽하게 이해됩니다.
함수에 대한 모든 입력 참조를 IT 매개 변수로 전달하지 않고도이를 수행하는 방법이 있습니까?
해결책
"코드-홀드"를하는 것은 Flex에서 고통 스럽습니다. JavaScript에서와 같이 부분 클래스 또는 프로토 타입 상속의 유연성 개념은 없습니다. 많은 리소스에 대한 "Flex의 코드-비만"에 대한 Google.
MXML에 코드를 임베딩한다는 아이디어에 익숙해지는 것이 낫다고 생각합니다. 인라인 코드를 최대한 피하는 스크립트 태그를 사용하십시오. MXML 내에 많은 코드를 작성 해야하는 경우 코드를 여러 사용자 정의 구성 요소로 다시 얻을 수 있습니다. 재사용 가능한 경우 보너스 포인트.
다른 팁
TextInputs의 상위 컨테이너 인스턴스에 대한 참조를 작성한 다음 해당 참조를 사용하여 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;
}
}
}
Flex에서 코드-비만을하는 표준 방법은 상속을 통한 것입니다. 다음은 문서의 좋은 설명입니다. http://learn.adobe.com/wiki/display/flex/code+behind. 간단히 말해서 :
- 기본 클래스로 사용하도록 ActionScript 클래스를 선언하십시오.
- 기본 클래스를 MXML 파일의 루트 컨테이너로 설정하십시오.
- 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>
다른 TextInput 컨트롤에 대한 et cetera. 그리고 이제 pupulatefromform 기능이 작동해야합니다.
동일한 엔티티를 두 번 소환 해야하는 것은 일종의 끔찍한 일이지만, 초기 응답자가 상처를 입은 것은 아닙니다.
이것을 .as로 가져옵니다 :
import mx.core.Application;
.
mx.core.Application.application.component.property = value;
mx.core.Application.application.myText.text = 'test';
MXML 파일에 ActionScript 파일을 가리키는 스크립트 태그가 있습니까?
<mx:Script source='includes/foo.as' />