慕妹3242003
2023-07-20 14:55:16
我有這個簡單的 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.nativeobject DiagramXML extends js.Objectobject 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 中正確呈現。
1 回答

ABOUTYOU
TA貢獻1812條經驗 獲得超5個贊
我可以確定您的翻譯中的兩個問題。第一個是import
的bpmn-js
。JS 導入是
import?Modeler?from?'bpmn-js/lib/Modeler';
應該翻譯成
@JSImport("bpmn-js/lib/Modeler",?JSImport.Default)
根據翻譯成的文檔import
@JSImport
。
另一個問題則更為微妙。在您的調用中new Modeler
,您有
js.Object(
? "container" -> "#canvas"
)
它(也許不幸的是)編譯但不做你認為它做的事情。它創建兩個字符串的 Scala 元組,該元組被傳遞給 JavaScript 函數,Object(...)該函數實際上會按原樣返回它(因為 Scala 元組已經是一個對象)。
您想要的是一個帶有字段的 JavaScript 對象container,您可以將其寫為
new js.Object {
? val container = "#canvas"
}
更好的方法是在外觀中使選項對象靜態類型化:
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"
})
添加回答
舉報
0/150
提交
取消