【问题标题】:ScalaJS facades with JS and application data带有 JS 和应用程序数据的 ScalaJS 外观
【发布时间】:2017-06-07 06:27:59
【问题描述】:

我正在尝试为 jQuery 插件 (https://github.com/devbridge/jQuery-Autocomplete) 编写外观。 In 包括一些回调,这些回调传递了我建模为的对象:

@js.native
trait AutocompleteSuggestion extends js.Object {
  val value: String = js.native
  val data : js.Any = js.native
}

库需要访问valuedata 供我使用。我创建对象,将其提供给库,然后它作为回调的参数将其返回给我。

创建这些对象我能做的最好的事情是

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 的示例中没有看到这一点——但这些示例也刻意避免使用原始类型以外的任何内容。

【问题讨论】:

    标签: scala.js


    【解决方案1】:

    我建议如下。基本上它归结为通过为data 的类型提供类型参数来更好地键入您的AutocompleteSuggestion。此外,我们将其设为 @ScalaJSDefined 特征而不是 @js.native(因为大多数 JS 特征无论如何都应该如此),以便我们可以以类型安全的方式实例化它:

    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
    }
    

    啊,不是一个单一的演员:)

    【讨论】:

    • 美丽。令我懊恼的是,我忽略了 ScalaJSDefined。感谢您再次阅读文档。
    猜你喜欢
    • 2018-12-05
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 2010-11-24
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多