2011-09-22 19 views
7

Tại sao ngôn ngữ mxml của khung công tác Flex không hỗ trợ một hàm tạo cho các thành phần hoặc chấp nhận các đối số hàm tạo cho các thành phần? Đó là như xa như tôi biết không thể tuyên bố một đối tượng ActionScript trong mxml nếu nó có đối số constructor. Tôi tò mò về lý do. Nó là một sự lựa chọn thiết kế của Adobe hoặc liên quan đến cách ngôn ngữ khai báo hoạt động như thế nào? Ví dụ: tại sao không cho phép:Tại sao mxml không hỗ trợ các nhà thầu thành phần?

<myNameSpace:MyComponent constructor="{argArray}"/> 
+0

có lẽ đây sẽ giúp: http://stackoverflow.com/questions/878043/how-do-i-populate-required-parameters-in-a-custom-mxml-tag –

+0

Cảm ơn Chris cho cực trả lời nhanh! Tôi đã tìm kiếm một lý do tại sao nó không thể thay vì một cách giải quyết - là nó là một cái gì đó mà nói chung là không thể trong ngôn ngữ khai báo và tại sao? –

+0

Và làm cách nào bạn khai báo nhiều hơn một đối số? Luôn luôn có chúng trong một mảng? –

Trả lời

6

Bạn có thể đọc IMXMLObject API trợ giúp để biết thêm thông tin về câu hỏi của bạn. Họ không nói chính xác tại sao một mxml không hỗ trợ các nhà xây dựng, nhưng nó nói rằng bạn phải kiểm soát thành phần mxml của bạn thông qua các sự kiện vòng đời của nó: preinitialize, initialize và creationComplete.

Tôi cho rằng đó là quyết định thiết kế, xem xét mxml được dịch trực tiếp sang mã AS3 (bạn có thể biên dịch ứng dụng của bạn thêm keep-generated-actionscript = true và xem nó tạo ra).

4

Thậm chí nếu một lớp được định nghĩa trong MXML, có thể thực hiện một hàm tạo thông qua việc tạo một biến cá thể như sau. Điều này sẽ được gọi trước khi các sự kiện khác nhau như "preinitialize" hoặc "creationComplete" được gửi đi.

<myNameSpace:MyComponent> 
    <fx:Script> 
    <![CDATA[ 
    private var ignored:* = myInstanceConstructor(); 

    private function myInstanceConstructor():* { 
     // Do something - called once per instance 
     return null; 
    } 
    ]]> 
    </fx:Script> 
</myNameSpace:MyComponent> 

Hơn nữa, biến lớp có thể được khởi tạo theo cách tương tự như sau.

<myNameSpace:MyComponent> 
    <fx:Script> 
    <![CDATA[ 
    private static var ignored:* = myClassConstructor(); 

    private static function myClassConstructor():* { 
     // Do something - called once per class 
     return null; 
    } 
    ]]> 
    </fx:Script> 
</myNameSpace:MyComponent> 
+0

Cảm ơn rất nhiều câu trả lời, có vẻ như một cách tiếp cận rất hữu ích. Sẽ thử nó. –

+0

Tôi sẽ thay đổi nó thành 'private const __new __(): * = construct();' không chỉ cho cú pháp đường mà còn vì nó không thay đổi. Tôi cũng sẽ làm cho 'construct() *' function 'protected' thành thừa kế. –