2011-07-25 27 views
5

Chciałbym dołączyć plik MXML do mojego pliku MXML w ten sam sposób, w jaki można dołączyć plik zewnętrzny w AS3 przy użyciu dyrektywy include. Korzystanie z dyrektywy include przenosi kod z zewnętrznego pliku do oryginalnego pliku podczas kompilacji, umieszczając go w tym samym zasięgu.Jak dołączyć plik MXML do wstawienia innego pliku MXML?

Na przykład

Application.mxml:

<Application> 

    <source="external.mxml"/> 

</Application> 

External.mxml:

<Styles/> 

<Declarations> 
    <Object id="test"/> 
</Declarations> 

muszę utrzymać ten kod/mxml/xml w zewnętrznych plik w zakresie z oryginałem. Nie pytaj mnie, dlaczego chcę to zrobić.

Inny przykład. Oto mój aktualny kod (uproszczony), wszystko w 1 pliku mxml:

...

File1.mxml 
<Button click="clickHandler()"/> 

<Script> 
public function clickHandler():void { 

} 
</Script> 

...

tutaj jest to, co chcę:

...

File1.mxml 
<Group> 

    <source="File2.mxml"/> 

    <Button click="clickHandler()"/> 

<Group> 


File2.mxml 
<Script> 
public function clickHandler():void { 
    trace(this); // File1.mxml 
} 
</Script> 

...

chcę podzielić się moją kod do osobnego pliku ...

~~ Aktualizacja ~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Chociaż nie było to, o co prosiłem za pomocą schematu "zza kodu" osiąga częściowe uznanie za zerwanie kodu z widoku. Dlatego tworzę plik MXML, MyGroup.mxml lub MyGroup.as, który rozszerza grupę zawierającą kod clickHandler.

Problem z tą metodą polega na tym, że jestem następnie zablokowany na typ klasy, który przedłużam, na stałe kodując widok. Na przykład, będę musiał rozszerzyć Grupę, jeśli klasa MXML, którą chcę podzielić na osobne pliki, jest Grupą.

Pracowałem nad projektami, w których to zostało zrobione i nie jest dobre. Ludzie zaczynają ustawiać style i aspekty wizualne lub grupować/wyświetlać określone właściwości w kodzie za klasą i później, kiedy lub kiedy musimy go zmienić lub układ, w którym kończymy wszystkie te zależności z kontenerem. Staje się bałagan. Dodatkowo, używając Code Behind, nie możesz go ponownie użyć (użyj ponownie w taki sposób, aby style styles.as były ponownie używane). To nie jest rozwiązanie, ale pomyślałem, że o tym wspomnę.

Oto kod za przykład

MyGroupBehind.mxml:

<Group> 

    <Script> 
    public function clickHandler():void { 
     trace(this); // File1.mxml 
    } 
    </Script> 

</Group> 

MyGroupAhead.MXML:

<MyGroupBehind> 

    <Button click="clickHandler()"/> 

</MyGroupBehind> 

Odpowiedz

1

Wystarczy zacząć wpisywać nazwę niestandardowego komponentu, a następnie naciśnij Ctrl + Spacja. Uzupełnianie kodu zapełni listę możliwych rzeczy, które możesz dodać, w tym nazwę komponentu. Użyj strzałki w dół, aby wybrać nazwę komponentu, a następnie naciśnij enter. Uzupełnianie kodu ustawi przestrzeń nazw i rozpocznie tag dla twojego komponentu. Jeśli przejdziesz do końca wiersza i wpisz "/>" (bez cudzysłowów), voila! będziesz mieć wbudowany znacznik, który reprezentuje niestandardowy komponent MXML.

+0

Tak, spowoduje to utworzenie wystąpienia komponentu w dokumencie, ale potrzebuję go, aby traktować zewnętrzny MXML tak, jakby był częścią tego samego dokumentu w tym samym zakresie. Załóżmy, że mam dokument z przyciskiem i obsługą kliknięcia w znaczniku skryptu. Chciałbym wziąć ten moduł obsługi kliknięć i umieścić go w innym pliku mxml. –

0

Po pierwsze, każdy zewnętrzny mxml powinien być poprawnym XML. Teraz, tak długo, jak masz poprawny plik MXML, wystarczy dodać go po imieniu jak poniżej:

<Application> 
<external:External/> 
</Application> 

Gdzie zewnętrzny "jest przestrzeń nazw dla pliku External.mxml.

+0

-1: To tworzy tylko instancję. OP chce rzeczywistego kodu inline. – merv

2

MXML jest konwertowany na klasę przez kompilator, więc nie ma możliwości zrobienia tego, o co prosisz.

Osobiście uważam, że to dobrze. Dzielenie rzeczy na oddzielne pliki nie jest równoznaczne z "bardziej zorganizowanym". W rzeczywistości powiedziałbym, że osiąga dokładnie odwrotny efekt. Lepiej skupić się na odpowiedniej strukturze komponentów, IMHO.

+1

Powiedziałbym, że jest bardziej zorganizowany i używam odpowiedniej struktury komponentów. Dodatkowo Adobe używa w oficjalnych komponentach Flex - AS, który jest odpowiednikiem tego, co próbuję zrobić. –

+0

@gigawatts Różnica polega na tym, że te elementy nie są "kodami klasy". Obejmują one takie rzeczy jak typowe style lub ustawienia konfiguracji. To, co próbujesz zrobić, nie jest możliwe, ponieważ kod znajduje się w klasie po skompilowaniu MXML. Nawet jeśli mógłbyś dołączyć ten kod, nie dałby ci pożądanego efektu (scalonej przestrzeni nazw). – drkstr

+0

Noted. Kompilator Flex ma kilka unikalnych funkcji ukrytych. Miałem i mam nadzieję, że istnieją podobne dyrektywy, aby to osiągnąć. IE nie wszystkie znaczniki MXML są konwertowane na klasy, deklaracje, metadane, style itp. –

-1

Say mój plik MXML nazywa Przykład w folderze widoki. Po prostu wywołaj go w macierzystym pliku MXML, który ma być w tym przypadku:

np.

<views:Example/> 
+0

-1: To tworzy tylko instancję. Jest to zasadniczo identyczne z [równie błędną odpowiedzią @ M.D.] (Http://stackoverflow.com/a/6819692/570918), więc zgłaszam, że jest ona zamknięta. – merv