与 scala.js 共享域,如何?

shared domain with scala.js, how?

可能是一个基本问题,但我对 scala.js 周围的各种文档和示例感到困惑。

我有一个领域模型,我想在 scala 和 scala.js 之间共享,比方说:

class Estimator(val nickname: String)

...当然我想在网络客户端(scala.js 与 angular 通过 angulate)和服务器(scala 与 spring-mvc在 spring-boot 上)。

class 是否应该扩展 js.Object?并使用 @ScalaJSDefined 注释(在 v0.6.15 中尚未弃用)?

编辑 2017-03-30:

实际上这与Angulate有关,我选择AngularJS的门面。对于 2 个功能(与 http 服务器通信和在 html 中显示模型字段),域 classes 必须是 Javascript classes。在 Angulate 的示例中,域模型是重复的。

也没有(遗憾的是)没有计划将 js.Object 包含在 scalajs-stubs 中来克服这个问题。 https://github.com/scala-js/scala-js/issues/2564 中的详细信息。也许 js.Object 不会对 jvm 造成太大伤害...

那么,scala.js 的哪些 Web 框架和外观可以/不能很好地支持共享域? 不是 angulate1,可能是 Udash,也许是 React?

(警告:我不知道 Angulate,这可能会影响其中的一些。不过一般来说...)

不,那些共享对象不应该从 js.Object 派生或使用 @ScalaJSDefined -- 这些仅适用于设计为与 JavaScript 本身交互的对象,它不会听起来这就是你的想法。仅适用于 Scala 的对象不需要它们。

但是是的——一般来说,您通常需要以一种或另一种方式来处理通信。您使用哪个 pickling 库取决于您(有几个),但请记住,通信只是一个字节流——您必须告诉系统如何在您的域对象和那些字节之间进行序列化和反序列化。

Scala.js 本身并没有任何自动功能——这只是一种语言,不会决定您的库选择。您 可以 使用隐式使酸洗成为半自动的,但我建议您对此谨慎一些。我在 Angulate 文档中没有看到任何明显的表明它自动进行酸洗的内容。