从angularjs upcalls到java只在手动页面刷新

时间:2016-11-24 09:54:35

标签: java angularjs javafx

我在javafx webview组件中使用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"});
              }
          }
        }
    );

JavaScriptBridge类有一个名为starttest的公共方法。班级本身就是公共班级。

public class JavaScriptBridge {

    private Logger log = Logger.getLogger(JavaScriptBridge.class.getName());

    public String val="test";

    public JavaScriptBridge() {
        log.log(Level.INFO, "Bridge was created");
    }

    public void starttest(){
        log.log(Level.INFO, "starting test");
    }

}

在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方法时,我收到以下错误消息:

nov 24,2016 10:50:12 AM be.azstlucas.cpr.view.Browser $ 1 messageAdded

INFO:java exists object {}

nov 24,2016 10:50:12 AM be.azstlucas.cpr.view.Browser $ 1 messageAdded

INFO:starttest不存在

nov 24,2016 10:50:12 AM be.azstlucas.cpr.view.Browser $ 1 messageAdded

INFO:错误:undefined不是函数(评估'window.javabridge.starttest()')

但是,如果我使用webview中的右键单击选项重新加载页面并重新运行该方法,那么由于某种原因,该方法确实存在并且执行没有任何问题。

有谁知道可能导致这种情况的原因?

1 个答案:

答案 0 :(得分:2)

更改这些代码行解决了我的问题。

log.log(Level.INFO, "initializing javascript");
JSObject window = (JSObject) engine.executeScript("window");
window.setMember("javabridge", new JavaScriptBridge());

我已经使JavaScriptBridge成为执行此代码的类的私有最终成员。