2015-06-21 26 views
1

如何使用Scala JS訪問氛圍API?使用Scala js的氛圍

所以說我有在JavaScript如下:

var socket = $.atmosphere 
... 
var request = { 
    url: "myurl/path", 
    ... 
}; 

request.onOpen = function(response) { 
    ... 
    subSocket.push("init") 
}; 
... 
socket.subscribe(request); 

將其等同是什麼在斯卡拉JS?

+1

http://msiebert.github.io/blog/calling-javascript-from-scalajs/ – invariant

回答

2

我想出了以下解決方案:

@JSName("$.atmosphere") 
object Atmosphere extends js.Object { 

    def info(msg: String): Unit = js.native 
    def subscribe(request: js.Object): Unit = js.native 
} 

trait Response extends js.Object { 
    val status: Int = js.native 
    val reasonPhrase: String = js.native 
    val responseBody: String = js.native 
    val headers: Array[String] = js.native 
    val state: String = js.native 
    val transport: String = js.native 
    val error: String = js.native 
    val request: String = js.native 
    val partialMessage: String = js.native 
    val errorHandled: Boolean = js.native 
    val id: Int = js.native 
} 

class Request(url: String) { 

    def contentType = "application/json" 
    def logLevel = "debug" 
    def transport = "transport" 
    def fallbackTransport = "long-polling" 

    def onOpen(res: Response) = {} 
    def onReconnect(req: Request, res: Response) = {} 
    def onMessage(res: Response) = {} 
    def onClose(res: Response) = {} 
    def onError(res: Response) = {} 

    def literal = js.Dynamic.literal(
     url = url, 
     contentType = contentType, 
     logLevel = logLevel, 
     transport= transport, 
     fallbackTransport = fallbackTransport, 
     onOpen = { (res: Response) => onOpen(res) }, 
     onReconnect = { (req: Request, res: Response) => onReconnect(req, res) }, 
     onMessage = { (res: Response) => onMessage(res) }, 
     onClose = { (res: Response) => onClose(res) }, 
     onError = { (res: Response) => onError(res) } 
    ) 
} 

用法是,則:

val request = new Request("myurl/path") { 
    override def onOpen(res: Response) = { 
     g.console.log("Opened " + res.responseBody) 
    } 
} 
Atmosphere.subscribe(request.literal) 

這樣我可以重寫該請求的各種屬性/處理程序。不過,我想知道這是否可以改善。例如,是否有替代JSName的用法?

@JSName("$.atmosphere")