2017-06-06 8 views
0

jQueryプラグインのファサード(https://github.com/devbridge/jQuery-Autocomplete)を記述しようとしています。オブジェクトを渡すいくつかのコールバックを含んで、私はのようにモデル化しました:JSとアプリケーションデータを含むスカラJSファサード

@js.native 
trait AutocompleteSuggestion extends js.Object { 
    val value: String = js.native 
    val data : js.Any = js.native 
} 
ライブラリが valueにアクセスする必要が

dataは私の用です。私はオブジェクトを作成し、それをライブラリにフィードし、コールバックの引数としてそれを返します。

私は、これらのオブジェクトを作成するために行うことができました最高のは、これらのオブジェクトの1つを渡され

object AutocompleteSuggestion { 
    def apply[T](value: String, data: T) = { 
    literal(value = value, data = data.asInstanceOf[js.Any]).asInstanceOf[AutocompleteSuggestion] 
    } 
} 

コールバックは、しばしば

def onSelect(suggestion: AutocompleteSuggestion): Unit = { 
    val cb = suggestion.data.asInstanceOf[CourseBasic] 
    // do something with the data 
} 

のようにどのように上の任意の提案を探して終わるですこれを改善する?特に私はたくさんのキャストをしているように感じます。 https://www.scala-js.org/doc/interoperability/facade-types.htmlの例ではわかりませんが、これらの例では、基本的な型以外のものの使用を慎重に避けています。

答えて

1

私は以下を推奨します。基本的には、タイプdataのタイプパラメータを指定することで、AutocompleteSuggestionの型を指定する方が良いでしょう。我々は、タイプセーフな方法でそれをインスタンス化することができるように加えて、我々は(ほとんどのJSの特徴はとにかくする必要がありますように)代わりに@js.native@ScalaJSDefinedトレイトます

import js.annotation._ 

@ScalaJSDefined 
trait AutocompleteSuggestion[T] extends js.Object { 
    val value: String 
    val data: T 
} 

object AutocompleteSuggestion { 
    def apply[T](value0: String, data0: T): AutocompleteSuggestion[T] = { 
    new AutocompleteSuggestion[T] { 
     val value: String = value0 
     val data: T = data0 
    } 
    } 
} 

def onSelect(suggestion: AutocompleteSuggestion[CourseBasic]): Unit = { 
    val cb = suggestion.data 
    // do something with the data 
} 

AAAND、ない単一のキャスト:)

+0

美しいです。私の嫌悪感に、私はScalaJSDefinedを無視しました。押してくれてありがとう、ドキュメントをもう一度読んでくれてありがとう。 – bwbecker

関連する問題