我有一个简单的Javascript代码:
import Modeler from 'bpmn-js/lib/Modeler';
import diagramXML from './diagram.bpmn';
const modeler = new Modeler({
container: '#canvas'
});
modeler.importXML(diagramXML);这将在浏览器中打开时显示一个图表。
我想在ScalaJS中这样做,但我错过了一些东西。
这是我的代码:
@JSImport("resources/diagram.bpmn", JSImport.Default)
@js.native
object DiagramXML extends js.Object
object Main {
@JSExportTopLevel("main")
def main(): Unit = {
val modeler = new Modeler(js.Object(
"container" -> "#canvas"
))
modeler.importXML(DiagramXML.toString)
}
}这是我的Modeler立面
@js.native
@JSImport("bpmn-js/lib/Modeler", "Modeler")
class BpmnJS(options: js.Object) extends js.Object {
def importXML(xml: String): js.Promise[Any] = js.native
}调试时,xml将正确加载。所缺少的就是它在DOM中被正确地呈现。
发布于 2020-11-08 17:39:38
我可以在你的翻译中发现两个问题。第一个是import of bpmn-js。JS导入是
import Modeler from 'bpmn-js/lib/Modeler';应该翻译成
@JSImport("bpmn-js/lib/Modeler", JSImport.Default)根据the documentation on translating import into @JSImport的说法。
另一个问题则更为微妙。在调用new Modeler时,您已经
js.Object(
"container" -> "#canvas"
)它(可能是不幸的)编译,但不做您认为它所做的。它创建两个字符串的Scala,并将其传递给JavaScript函数Object(...),后者实际上将按原样返回它(因为Scala已经是一个对象)。
您想要的是一个带有字段container的container对象,您可以将其编写为
new js.Object {
val container = "#canvas"
}一个更好的方法是在facade中静态地输入options对象:
class BpmnJS(options: BpmnJSOptions) extends js.Object {
..
}
trait BpmnJSOptions extends js.Object {
var container: js.UndefOr[String] = js.undefined
}那样的话,你就可以把它叫做
new BpmnJS(new BpmnJSOptions {
container = "#canvas"
})https://stackoverflow.com/questions/64740345
复制相似问题