tags: Vaadin
Import 方式
Annotation
- @JavaScript
- @JsModule
- 注意1:這種import方式,只要中間其中一個lib出錯,後續的lib皆import失敗
- 注意2:Vaadin會將這些import的檔案,重新處理壓縮並包成一個Vaadin自己的Javascritp file
@JavaScript("https://code.jquery.com/jquery-3.5.1.min.js")
Method
- addJavaScript()
- addJsModule()
NPM
- 推薦使用NPM,只要修改版號,重新build project即可
- 無須人工重新下載Javascript library,再取代舊檔案
Excute Javascript
Server calls Client
Executing JavaScript in the Browser
Execute JS的API
- The script is executed asynchronously
- 因為是異步,故不可將值回傳給server (單向)
- 亦可在Java端傳遞參數給Javascript,如:$0, $1
- 型態:String, Boolean, Integer, Double, JsonValue and Element
- 好處是利用Java 接將html element的實體
// executeJs
UI.getCurrent().getPage().executeJs("console.log($0 + ' size:', " + "$1.offsetWidth, $1.offsetHeight)", name, element);
// callJsFunction
getElement().callJsFunction("expand",component.getElement())
Add Javascript Function
Client calls Server
- 利用
this.$server.方法名稱
於client呼叫server的方法 - 方法1:直接於Java撰寫,
executeJs()
private void init(){
...
getElement().executeJs("this.$server.setFullscreenItem(screenfull.isFullscreen);"); // 根據瀏覽器當時狀況顯示
...
}
@ClientCallable
private void setFullscreenItem(boolean isFullscreen) {}
- 方法2:撰寫於Javascript file中
let self;
initModel = function (data) {
...
// 先將server的實體從server丟到client
self = data.element.$server;
...
}
function onDocumentMouseMove(event) {
...
// 將client取得的資料,回傳給server
self.getDataFromClient({target: 'BOX', x: point.x, y: point.y, z: point.z,});
...
}
@ClientCallable
private void getDataFromClient(JsonObject object) {}
NPM 範例
jQuery2
- Java class
@NpmPackage(value = "jquery", version = "3.6.0")
@JavaScript("./src/jquery-loader.js")
- 需額外的loader.js,定義全域變數
import jQuery from "jquery";
// define jquery globally in the JavaScript file.
window.jQuery = jQuery;
window.$ = jQuery;
ThreeJS3
- Java class
@NpmPackage(value = "three", version = "0.126.0")
- 需額外的loader.js,定義全域變數
import * as THREE from three;
window.THREE = THREE;
PlotlyJS4
- 若官方給的library有BUG,如何處理?
- plotly.js
- 關鍵字搜尋:
define(d3)
- 將
}();
改為}.apply(self);
- 關鍵字搜尋:
- plotly.min.js
- 關鍵字搜尋:
{}],170
- 處理方式同上
- 關鍵字搜尋:
if (typeof define === "function" && define.amd) this.d3 = d3, define(d3); else if (typeof module === "object" && module.exports) module.exports = d3; else this.d3 = d3;
}();
},{}],170:[function(_dereq_,module,exports){
Local Import 範例
- 利用Annotation:
@JavaScript
,@JsModule
進行import - 將檔案置於專案的
src\main\resources\META-INF\resources\frontend\js
底下
Cesium.js
- 檔案路徑:
src\main\resources\META-INF\resources\frontend\js\cesium\Cesium.js
- 若要於java使用
@JsModule("./js/cesium/Cesium.js")
- 若要於javasript使用
import * as Cesium from "./cesium/Cesium.js";
Creating a Vaadin Flow Server-Side API for a Javascript component
https://www.flowingcode.com/en/creating-a-vaadin-flow-server-side-api-for-a-javascript-component/ ↩︎Vaadin 官方教學文件
https://vaadin.com/learn/tutorials/integrate-jquery-into-vaadin-flow ↩︎參考解法
https://github.com/plotly/plotly.js/issues/3518#issuecomment-517138019 ↩︎
沒有留言:
張貼留言