几周前,我将我的 Play+ScalaJS 项目从 ScalaJS 0.6.32 升级到了 1.4.0。一切都在开发中运行良好。今天我尝试部署它并因此fullLinkJS
第一次执行。它产生了许多错误:
sbt:browser> fullLinkJS
[info] Full optimizing /Users/bwbecker/oat/src/oat3/_browser/target/scala-2.12/browser-opt
[error] c91662c1ae832d6a8493/oat/browser/views/bulkmail/BMailCreateView.scala(125:43:Apply): scala.Dynamic expected but any found for tree of type org.scalajs.ir.Trees$JSSelect
[error] c91662c1ae832d6a8493/oat/browser/views/components/filteredTable/FilteredBMailTable.scala(81:53:Apply): scala.Dynamic expected but any found for tree of type org.scalajs.ir.Trees$JSSelect
[error] c91662c1ae832d6a8493/oat/browser/models/Autocomplete.scala(156:18:Apply): scala.Dynamic expected but any found for tree of type org.scalajs.ir.Trees$JSSelect
[error] c91662c1ae832d6a8493/oat/browser/views/virtualq/QueueAddEditView.scala(90:52:Apply): scala.Dynamic expected but any found for tree of type org.scalajs.ir.Trees$JSSelect
[error] c91662c1ae832d6a8493/oat/browser/views/bulkmail/edit/BMailSendView.scala(273:62:Apply): scala.Dynamic expected but any found for tree of type org.scalajs.ir.Trees$JSSelect
[error] c91662c1ae832d6a8493/oat/browser/views/bulkmail/TemplateListView.scala(42:64:Apply): scala.Dynamic expected but any found for tree of type org.scalajs.ir.Trees$JSSelect
...
我查看了源代码中大约十几个引用的行。它们中的大多数都引用了 Play 路由或调用该url
方法。其余的涉及对 jQuery 的调用。
该项目有一个跨平台的子项目。那个做fullLinkJS就好了。还有一个特定于客户端的 ScalaJS 项目。这就是错误发生的地方。
我正在使用 ScalaJS 1.4.0 和 Play 2.6.25。
关于如何进行的建议?
后来,在阅读了@sjrd 的回复后
有问题的代码示例:
private val wapp = routes.oat.wapp.controllers.BMailCtrl
...
window.location.href = wapp.edit(emailId).url // this is the line flagged with the error
window
中定义org.scalajs.dom
为js.Dynamic
。
routes
在我的代码中定义为val routes: js.Dynamic = global.jsRoutes
. js.Dynamic
类型注释是 IntelliJ 推断的。
啊哈! global
被定义scala.scalajs.js
为扩展scala.Dynamic
。但我认为jsRoutes
应该解释为js.Dynamic
. 它是 Play 服务器生成的路由。
看来我需要改变访问这些人的方式。研究,特别是Scala.js GlobalScope。
再后来——修复
我正在记录我在这里所做的事情,以便我可以将 sjrd 的答案标记为“答案”。
如前所述,我的大部分 IR 验证错误都在表格的行上
window.location.href = wapp.edit(emailId).url
href
有一个类型String
并且url
是js.Dynamic
但产生一个字符串。我认为这就是问题所在。
然而,修复很简单:添加toString
:
window.location.href = wapp.edit(emailId).url.toString
所有其他 IR 验证错误都是具有类似修复的变体。