代码之家  ›  专栏  ›  技术社区  ›  Pavel V.

如何在Dojo中链接“范围更改”和“更新结束”事件?

  •  0
  • Pavel V.  · 技术社区  · 9 年前

    在ArcGIS JS API中,当扩展更改后的处理完成时,我需要触发类的一个方法。我没有为此找到任何特别的活动。 extent-change 在数据尚未加载时过早触发。 update-end 也由我想调用的函数触发,形成一个无休止的循环。所以我需要的是将这两个事件联系在一起,第二个事件只需一次。但如何?

    我的大多数活动都是这样的:

    this.events.push(on(this.map, "extent-change", lang.hitch(this, this._foo)));
    

    这不适合事件链接,因此我需要以其他方式创建链接的事件。我所尝试的:

    _foo: function () {
        function fooEvent() {
            this._bar();
            dojo.disconnect(updateHandle);
        }
        var updateHandle = dojo.connect(map, "onUpdateEnd", fooEvent());
    }
    

    _bar 是我希望在扩展更改结束时运行的方法。然而 this 在事件处理程序中表示其他内容,而不是包含函数的类。我还尝试了我在 declare 声明,但运气不佳。

    _foo() _bar() 我们在同一个班级 "foobar/baz" ). 然而,在 fooEvent() 并不像我希望的那样是它的子类——当我尝试使用 this.inherited 在它里面,它是未定义的。我尝试的另一种方法是添加 event 参数,但它也是未定义的。因此,除非有更好的方法,否则我需要了解如何获得 “foobar/baz”

    我尝试的另一种方法是 lang.hitch 再次以以下方式之一:

    //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));
    

    它们都没有返回任何明确的错误,尽管 _bar() 这个方法似乎在一段时间内奏效了,但现在行不通了,这对前面的三种方法都是如此。我不明白这些听众在做什么。

    1 回复  |  直到 9 年前
        1
  •  0
  •   Pavel V.    9 年前

    我通过扁平化事件侦听器来解决这个问题。首先,我做了一面旗帜 _reloadFlag ,在构造函数中初始化为 false 然后改为 true 每当我想打电话的时候 _bar ,就像在 _foo . _棒 现在开始测试 _重新加载标志 要么将其设置为 或者什么也不回。事件侦听器现在如下所示:

    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)));