angularjs对java的向上调用只有在手动刷新页面后才起作用
我正在JavaFXWebView组件中使用angularjs构建一个小应用程序 我在changelistener中使用此代码附加javascript桥对象angularjs对java的向上调用只有在手动刷新页面后才起作用,java,angularjs,javafx,Java,Angularjs,Javafx,我正在JavaFXWebView组件中使用angularjs构建一个小应用程序 我在changelistener中使用此代码附加javascript桥对象 private void initJavaScriptBrige(){ log.log(Level.INFO, "initializing javascript"); JSObject window = (JSObject) engine.executeScript("window"); window.setMembe
private void initJavaScriptBrige(){
log.log(Level.INFO, "initializing javascript");
JSObject window = (JSObject) engine.executeScript("window");
window.setMember("javabridge", new JavaScriptBridge());
}
engine.getLoadWorker().stateProperty().addListener(
new ChangeListener<State>() {
@Override public void changed(ObservableValue ov, State oldState, State newState) {
log.log(Level.INFO, "State chaged to {0} for page {1}", new Object[]{newState.name(), engine.getLocation()});
if(newState.equals(State.SUCCEEDED)){
initJavaScriptBrige();
//check is the bridge exists
JSObject window = (JSObject) engine.executeScript("window");
Object java=window.getMember("javabridge");
log.log(Level.INFO, "java {0}", new Object[]{java==null?"does not exist":"exists"});
}
}
}
);
在javascript(angularjs)中,我使用此代码执行命令
startTest(){
if(window.javabridge){
console.log("java exists "+(typeof window.javabridge)+" "+JSON.stringify(window.javabridge));
if(window.javabridge.starttest){
console.log("starttest exists");
window.javabridge.starttest();
}else{
console.log("starttest does not exist");
window.javabridge.starttest();
}
}else{
console.log("java does not exist");
}
}
执行starttest javascript方法时,会收到以下错误消息:
2016年11月24日上午10:50:12 be.azstlucas.cpr.view.Browser$1消息已添加
信息:java存在对象{}
2016年11月24日上午10:50:12 be.azstlucas.cpr.view.Browser$1消息已添加
信息:starttest不存在
2016年11月24日上午10:50:12 be.azstlucas.cpr.view.Browser$1消息已添加
信息:错误:undefined不是函数(正在计算'window.javabridge.starttest()')
但是,如果我在webview中使用右键单击选项重新加载页面并重新运行该方法,那么由于某种原因,该方法确实存在,并且执行时没有任何问题
log.log(Level.INFO, "initializing javascript");
JSObject window = (JSObject) engine.executeScript("window");
window.setMember("javabridge", new JavaScriptBridge());
有人知道这是什么原因吗?更改这些代码行解决了我的问题
log.log(Level.INFO, "initializing javascript");
JSObject window = (JSObject) engine.executeScript("window");
window.setMember("javabridge", new JavaScriptBridge());
我已经使JavaScriptBridge成为执行此代码的类的私有final成员。将我的桥更改为控制器中的私有final变量为我做到了这一点。然后我发现,把它放在一个变量中,再把它添加到ChangeListener中,也能做到这一点。如果这对任何人都有帮助:在Java代码中,请确保保留对bridge对象的引用。我花了几天的调试才发现,否则,桥对象将被垃圾收集,无法从Javascript访问。我不知道为什么,但我的代码在linux和MacOS上运行时没有问题,但是桥接对象是GCed。如果在(滚动到“更改”部分)中找到解释,请在“Java对象传递到JavaScript时修复内存泄漏”下进行解释。这是修复错误的一种效果。