2012-07-05 5 views
0

나는 flex/flash를 배우고 있는데, 나는이 것을 잃어 버렸다. 내가보기의 잔뜩에 "데이터"를 사용하고 잘 작동합니다. 어떤 이유로 여기서는 작동하지 않습니다. 일반적인 장소에서정의되지 않은 속성 데이터에 대한 액세스 flex

function LoginLoaded (e:Event):void { 
        trace(e.target.data); 
        var ServerReturn:String; 
        ServerReturn = new String(e.target.data); 
        data.UserCommonReturnData = ServerReturn; 
        navigator.pushView(CommonPlaces, data); 
       } 

여기에 내가 그것을 다시로드하려고보기 :

내가 여기 문자열로 필드를 설정 정의되지 않은 속성이 오류를 제공

var CommonPlacesData:String = new String(); 
      var CurrentSelect:String = new String(); 
      CommonPlacesData = new String(data.UserCommonReturnData); 

"액세스 데이터 "나는 data.PickUpTime (또한 문자열) 같은 것을 호출하면 다른 뷰에서 잘 작동하기 때문에 얻지 못합니다.

데이터는이 같은 첫 번째보기에서 시작 :

[Bindable] public var User:ObjectProxy = new ObjectProxy(); 

User.ID = "2314084"; 
navigator.pushView(TaxiNowOrLaterView, User); 

을 나는이처럼에 전화를 나중에보기에 :

var PickUpString:String = new String(data.ID); 

어떤 도움이 좋을 것 (잘 작동)! 감사!!!

+1

"데이터"가 어떤 인스턴스인지 클래스 정의를 표시 할 수 있습니까? – Mircea

+0

내 질문에 위의 코드를 추가했습니다. –

+0

나 혼란스러워. "사용자"의 클래스 정의는 볼 수 있지만 "데이터"는 볼 수 없습니다. 귀하의 코드에서 나는 "사용자"가 "데이터"에 대한 프록시라고 가정합니다. "데이터"를 "사용자"로 교체 할 수 있는지 확인하십시오. – Mircea

답변

1

코드에 대해 몇 가지 사항이 있습니다. 먼저 식별자에 언어의 이름을 붙이는 습관을 들여야합니다. 대문자로 시작하고이어서 단어의 논리적 부분 (PascalCase라고도하는 시스템)에 대해 소문자를 사용하는 식별자는 클래스 이름 지정에만 사용됩니다. 나머지 식별자는 camelCase를 사용해야합니다 (PascalCase와 유사하지만 첫 문자는 대문자로 표시되지 않음). **. 이렇게하면 코드를 이해하는 데 드는 노력이 크게 줄어 듭니다. 숙련 된 AS3 프로그래머는 코드를 다음과 같이 해석합니다.

// Static constant (!) ID of the class User is assigned (?) a value of "2314084" 
User.ID = "2314084"; 
// invoke a method pushView of a local variable navigator with arguments 
// of which first is the class TaxiNowOrLater, the second is the class User 
navigator.pushView(TaxiNowOrLaterView, User); 

아마도, 당신은 그것을 의미하지 않았을 것입니다.

new String(); 

AS3과 관련하여 전혀 이해가되지 않습니다. 문자열은 결코 참조 할 수 없으며, 변경할 수없고 대부분의 프로그래머가 합의한 문자 그대로의 구문을 사용합니다. 위의 코드는 ""과 동일합니다. 유사한 방식으로 new String(anotherString)anotherString과 완전히 동일한 효과를냅니다.

귀하의 질문 :event.target은 많은 것들이 다를 수 있으며, 그 중 일부는 "데이터"라는 속성을 가질 수도 있고 그렇지 않을 수도 있습니다. 이 문제에 대한 일반적인 접근 방식은 event.currentTarget 또는 event.target 값을 이벤트를 전달할 것으로 예상되는 유형으로 캐스팅해야한다는 것입니다. 같은 이벤트가 버튼이 아닌 객체에 의해 파견 된 경우이 오류로부터 보호되지 않습니다

private function clickHandler(event:MouseEvent):void { 
    if (Button(event.currentTarget).enabled) // do things 
} 

하지만 것입니다 : 당신은 다음, Button 클래스의 인스턴스에서 이벤트를 기대하고 가정 어떤 클래스가 다른 클래스로 캐스팅하려고했는지 알려주므로 오류보고를 좀 더 의식하게 만드십시오. 프로그램 로직 핸들러가 처리하지 말아야 이벤트에주의해야하는 경우

(왜?) 그런 다음이처럼 쓸 수있다 :

private function clickHandler(event:MouseEvent):void { 
    var button:Button = event.currentTarget as Button; 
    if (button && button.enabled) // do things 
} 

event.targetevent.currentTarget 대 - 아주 - 아주 드물게는 것 event.target이 필요합니다. 대부분의 경우 currentTarget이 필요합니다.나는 그것이 잘못되었다고 말하는 것이 아니라 그것이 문제가 될 것처럼 보입니다. target은 이벤트의 첫 번째 원인 인 객체입니다. 이벤트는 버블 링 될 수 있습니다. 즉, 디스플레이 목록 계층 구조를 위쪽에서 아래쪽으로 이동할 수 있습니다. 먼저 부모에서 자식으로, 그런 다음 역방향으로 이동할 수 있습니다. 아래 예제에서 이벤트가 생성되면 클릭 한 레이블이 버튼에 있다고 가정합니다.이 경우 버튼에 수신기를 추가하더라도 event.target은 버튼이 아니라 버튼 레이블입니다. currentTarget은 반대로 이벤트를 처리기로 전달한 직접 개체입니다.

더 많은 것들 : ObjectProxy은 바보 같은 수업입니다. 어떤 이벤트에도 사용하면 안됩니다. 그것은 아무런 목적도없고 버그 일 수도 있지만 지금까지 버그를 발견하는 데는 거의 신경을 쓰지 않았습니다. 간단히 말해 다음과 같습니다 : 객체를 생성합니다.이 객체는 속성의 동적 생성, 할당 및 제거를 "감시"하고 이러한 이벤트가 발생할 때 이벤트를 전달합니다. 이 동작은 많은 오류와 암시적인 버그가 발생하기 쉽습니다. 예를 들어, foo.bar = "baz"; foo.bar = "baz";은 동일한 속성의 재 할당 여부입니까? 은 foo.bar의 수정인가요? 속성 이름이 아픈 것이 아니라면 어떨까요? 등등.

왜 사용하면 안되나요? 데이터를 치료하는 더 좋은 방법이 항상 있습니다. 더 투명하고, 디버그하기 쉽고, 효율적입니다. 이 클래스는 실제로 작동하지 않은 프로토 타입입니다. 위에 설명 된 동작 외에도 코드를 작성하는 데 사용 된 코드 라인 측면에서 엄청납니다. 내부에서 발생하는 오류를 디버깅하는 데는 많은 시간과 인내가 필요합니다.

사용자를 나타내는 데 개체가 필요한 경우 사용자가 가질 것으로 예상되는 속성으로 클래스를 정의하고 해당 클래스 만 사용하면 디버깅 및 코드 이해가 훨씬 쉬워집니다.

[Bindable] 메타 데이터가 악합니다. 너무 자주 사용되기 때문에 피해야한다고 말할 수는 없지만 그렇게 할 것입니다. 가능한 한 많이 피해야합니다. 나는이 메타의 사용이 정당화 될 때의 예를 아직 만나지 않았다. ObjectProxy과 비슷한 정신으로 많은 것은 성능이나 모서리 케이스에 대해 많은 고려가있는 게으른 프로그래머를 위해 설계된 프로토 타입입니다. 이것은 다시 암시 적 버그가 많은 소스이며, 일반적으로이 메타를 중심으로 생성 된 코드로 인해 오류를 삼키는 것이 어렵습니다. 이 메타의 대안은 사용자 정의 이벤트가있는 일반 addEventListener(...) 코드입니다.

불행하게도, 튜토리얼의 많은 ... 빠르게 언어 + 프레임 워크를 시작하는 이러한 종류의 코드를 사용합니다

**이 규칙에는 몇 가지 예외가있다 : 상수는 모두 대문자이며, 네임 스페이스 이름은 밑줄을 사용하여 단어의 논리적 부분을 분리하지만 대문자는 사용하지 않습니다.

관련 문제