Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
angularjs对java的向上调用只有在手动刷新页面后才起作用_Java_Angularjs_Javafx - Fatal编程技术网

angularjs对java的向上调用只有在手动刷新页面后才起作用

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

我正在JavaFXWebView组件中使用angularjs构建一个小应用程序

我在changelistener中使用此代码附加javascript桥对象

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时修复内存泄漏”下进行解释。这是修复错误的一种效果。