我总是和Javascript范围争吵。
我在等待JSON响应时尝试显示加载对话框,如下所示:
public static final String IN_MEM_RULE_PATH = "src/main/resources/";
public static final String RULE_RESOURCE_TYPE = "drl";
public static byte[] createKJar(ReleaseId releaseId, List<String> ruleContentList) {
KieServices kieServices = KieServiceProvider.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
kfs.generateAndWritePomXML(releaseId);
ruleContentList.forEach(drl -> kfs.write(IN_MEM_RULE_PATH + drl.hashCode() + "." + RULE_RESOURCE_TYPE, drl));
KieBuilder kb = kieServices.newKieBuilder(kfs).buildAll();
if (kb.getResults().hasMessages(Message.Level.ERROR)) {
for (Message result : kb.getResults().getMessages()) {
log.info("Error: " + result.getText());
}
throw new RegnatorException("Unable to create KJar for requested conditions resources", RegnatorError.ErrorCode.UNDEFINED);
}
InternalKieModule kieModule = (InternalKieModule) kieServices.getRepository().getKieModule(releaseId);
byte[] jar = kieModule.getBytes();
return jar;
}
但是,当在onreadystatechange函数内部时,没有定义。$。ProcessingDialog。
如何从内部调用它?
非常感谢!
答案 0 :(得分:2)
这不是聚合物本身,这是一个关于范围界定的常见问题。这里真正的问题是你的回调this
内部没有引用你的组件,但它是该函数的引用。解决此问题的最常见方法是花费大量时间在另一个变量中备份上下文。所以在回调之前你会做类似
var that = this;
在你的函数中你会使用另一个变量,所以
this.$.processingDialog.close();
变为
that.$.processingDialog.close();
或者,根据您的构建过程或您要支持的浏览器,如果您可以使用ES6,the arrow function语法不会创建新的this
,那么您只需更改
toQueueRequest.onreadystatechange = function () {
// ..
}
到
toQueueRequest.onreadystatechange = () => {
// ..
}