2017-01-21 7 views
1

window#postMessage 처리기에서 다른 이벤트를 일치시키고 싶지만 기본 특성과 일치하지 않습니다. 나는 다른 iframe을 다른 차트를scalajs에서 일치하는 event.data 방법

@js.native 
trait XY extends js.Object { 
    val x: AnyVal = js.native 
    val y: AnyVal = js.native 
} 

@js.native 
trait DataEvent extends js.Object { 
    val c: String = js.native     // chart 
    val s: String = js.native     // dataSet 
    val d: XY = js.native      // xy data 
    val x: Seq[XY] = js.native     // eXtra data 
} 

object ChartApi extends JSApp { 
    def receiveMessage(event: Any): Unit = { 
    event match { 
     case DataEvent => ??? 
     case _ => println("else") 
    } 

    println(s"lala $event") 
    } 

    def main(): Unit = { 
    // add window event handler 
    dom.window.addEventListener("message", (event: MessageEvent) => receiveMessage(event.data), false) 
    println("Hello world!") 

    } 
} 

나는 또는 "데이터 지우기" "이 데이터를 추가"PostMessage를 통해 같은 이벤트를 보낼 필요가 : 그래서 나는이 문제를 해결할 수있는 방법에 대해 설명합니다.

답변

1

JS 특성에는 런타임에 ID가 없기 때문에 임의의 개체가 JS 특성의 인스턴스인지 여부를 직접 테스트 할 수 없습니다.

대신 JS 방식으로 이동하여 특성이 나타내는 인터페이스를 고유하게 식별하는 필드가 있는지 테스트해야합니다. 예를 들면 다음과 같습니다.

if (event.hasOwnProperty("d")) { 
    // it must be a DataEvent, because the alternatives do not have a 'd' field 
    val e = event.asInstanceOf[DataEvent] 
    ... 
} else { 
    ... 
} 

일반적으로 우리는 그렇게하고 싶지 않습니다. 따라서 이와 같은 여러 종류의 메시지가 포함 된 메시징 프로토콜에서 우리는 일반적으로 messageType 필드 또는 이와 유사한 것을 명시합니다.

object DataEvent { 
    def unapply(event: Any): Option[DataEvent] = 
    if (event.messageType == "data") Some(event.asInstanceOf[DataEvent]) 
    else None 
} 

당신이 다음 패턴으로 사용할 수 있습니다

if (event.messageType == "data") { 
    val e = event.asInstanceOf[DataEvent] 
    ... 
} else { 
    ... 
} 

당신은 추출기이 "형식 시험"을 인코딩 할 수 있습니다 : 당신은 모든 DataEvent 메시지 a messageType = "data" 필드, 당신이 할 수 있는지 확인하는 경우 다음과 같이 일치 :

event match { 
    case DataEvent(event) => ??? 
    case _ => println("else") 
} 

마지막으로, 당신이 대신하는 경우 클래스로 모든 메시지를 돌봐 직렬화/산세 라이브러리를 고려할 수 있습니다. 그러한 라이브러리 목록은 https://www.scala-js.org/libraries/libs.html을 참조하십시오.