我尽力在我的上下文之外复制错误但却失败了,所以我必须提供它。
代码:
var view;
widget = {
activated: false,
close: function(){
this.view.popupManager.enabled = false;
}
}
view = new MapView({
}).then(function(){ //then is triggered when fully loaded;
console.log(this.popupManager) //Object!
widget.activated = true;
widget.view = this;
}
console.log(view.popupManager) //Undefined, not loaded yet
$('#my_button').click(function(){
if(widget.activated){
widget.close() //this.view.popupManager is undefined
}
})
这是使用Esri的Javascript 4.3 API,但它似乎不是API,但我对Javascript中的范围如何工作有一些误解。
正如您所看到的,即使widget.close
仅在view
完全加载时调用select name, Amount, NewColumn = right('0000000000'+ convert(varchar(10),convert(int,amount*100)),10) from yourtable
,它仍会引用旧的,未完全加载的对象
我错过了什么?
答案 0 :(得分:4)
这里的问题是result: [no trailing newline]; exit code: 1
并不总是你认为的那样。您的代码中有几个this
,每个都不同。
欢迎JavaScript经常被误解this
。
在代码中
this
widget = {
activated: false,
close: function(){
this.view.popupManager.enabled = false;
}
}
会引用this
。
现在在widget
回调中的代码中,then
会引用this
对象,因此您实际上是在说window
。这个widget.view = window
可能就是那个让你感动的人。
我怀疑你的意思是将小部件的视图设置为新视图,在这种情况下,您需要更新代码,如下所示:
this