问题
In ArcGIS JS API I need to trigger a method of my class when the processing after an extent change is complete. I didn't find any special event for this. extent-change
triggers too early, when the data are not loaded yet. update-end
is triggered also by the function I want to call, making an endless loop. So what I need is to link the two events together, the second one just once. But how?
Most of my events look like this:
this.events.push(on(this.map, "extent-change", lang.hitch(this, this._foo)));
This is not suitable for event linking, so I need to make the linked event some other way. What I've tried:
_foo: function () {
function fooEvent() {
this._bar();
dojo.disconnect(updateHandle);
}
var updateHandle = dojo.connect(map, "onUpdateEnd", fooEvent());
}
_bar
is the method I want to run on the end of the extent change. However, this
in the event handler means something else, not the class containing the function. I also tried the classname I declared in the declare
statement, but with no luck.
_foo()
and _bar()
are in the same class (let's call it "foobar/baz"
). However, inside of the fooEvent()
is not its subclass as I hoped - when I try to use this.inherited
within it, it's undefined. Another way I try is to add event
argument to the handler, but it's undefined as well. So unless there is some better way, I need to understand how to get the object of "foobar/baz"
class.
Another way I tried was to use lang.hitch
once more, in one of the following ways:
//through the cluster event
var updateHandle = dojo.connect(map, "onUpdateEnd", lang.hitch(this, clusterEvent));
//or directly calling _bar()
var updateHandle = dojo.connect(map, "onUpdateEnd", { langh:lang.hitch(this, this._bar), disc:dojo.disconnect(updateHandle)});
//or through on, leaving a rouge event listener
dojo.on(map, "onUpdateEnd", lang.hitch(this, this._bar));
None of them returns any clear error and though the _bar()
method seemed to work for some time, it doesn't work now - this is true for all three of the previous. I don't understand what these listeners do.
回答1:
I solved this issue by flattening the event listeners. First, I made a flag _reloadFlag
, initialized in the constructor as false
and then changed to true
whenever I want to call _bar
, like in _foo
. _bar
now starts with a test of _reloadFlag
either setting it to false
or returning nothing. The event listeners now look like this:
this.events.push(on(this.map, "extent-change", lang.hitch(this, this._foo)));
this.events.push(on(this.map, "update-end", lang.hitch(this, this._bar)));
来源:https://stackoverflow.com/questions/35751571/how-to-link-extent-change-and-update-end-events-in-dojo