【问题标题】:How can I create custom events for google maps api v3 objects?如何为 google maps api v3 对象创建自定义事件?
【发布时间】:2014-02-14 18:25:09
【问题描述】:

我想制作一种特殊类型的多边形对象,它环绕或继承自 google.maps.Polygon 类。我希望它有一个可以收听的自定义edited 事件,最好是通过普通的addListener 接口。这个可以吗?

【问题讨论】:

    标签: google-maps events google-maps-api-3


    【解决方案1】:

    在标题为 Fun with MVC 的 Google Developers 文章中,我们找到了两种方法。

    1. Binding Properties 部分中,我们了解到每当在MVCObject 上调用set(property, value) 方法时,都会调用一个神奇的property_changed 函数(如果存在)。

      // Prints "something changed to ftw!!!"
      myObject.something_changed = function(){
        console.log('something changed to ' + this.get('something'));
      }
      myObject.set('something', 'ftw!!!');
      
    2. Outputting Information 部分中,我们了解到不那么神秘的addListener() 方法也可用于通过set() 监听值的变化。下面的代码 sn-p 和上面的代码完全一样。

      // Prints "something changed to ftw!!!"
      myObject.addListener('something_changed', function(){
        console.log('something changed to ' + this.get('something'));
      }
      myObject.set('something', 'ftw!!!');
      

    我更喜欢方法 #2,因为它涉及的黑魔法更少。

    【讨论】:

    • 感谢您分享您的知识,但您提出这些问题似乎只是为了提供您自己的答案。因此,当您对答案不感兴趣时​​,您可以节省喜欢给出答案的用户的时间并在问题中发布相关通知。
    • 但是,当您想创建一个继承自另一个“类”的“类”时,使用原型(如史蒂夫·詹森的回答中所述)是更好的方法,因为您必须尝试为每个实例定义自定义事件。
    • @Dr.Molle - 回答你自己的问题是可以接受的,贾斯汀不需要在问题中添加任何内容来解释他的意图:stackoverflow.com/help/self-answerblog.stackoverflow.com/2011/07/…
    • 他不需要解释他的意图,但他这样做是公平的,以节省其他用户开始回答不需要答案的问题的时间。
    • @Dr.Molle 我在发布问题的同时回答了这个问题;没有我的回答,就不可能有人看到这个问题。
    【解决方案2】:

    我喜欢 JustinY 的回答。

    另一种方法是手动触发这样的事件:

     function CustomPolygon(options) {
         var self = this;
         // initialize any options
         console.log('init')
     }
    
     function edit() {
         // do work!!!
         // now tell people about it!
         google.maps.event.trigger(this, 'edited');
     }
    
     // extend CustomPolygon from google.maps.Polygon
     CustomPolygon.prototype = new google.maps.Polygon();
     CustomPolygon.prototype.edit = edit;
    
     // now you can do 
     var p = new CustomPolygon({ /*options*/
     });
     google.maps.event.addListener(p, 'edited', function () {
         document.body.innerHTML = 'edited!';
     });
     p.edit();
    

    http://jsfiddle.net/stevejansen/hQZcT/

    来源:https://developers.google.com/maps/documentation/javascript/reference#event

    【讨论】:

    • 我不知道 event.trigger 方法。我想我更喜欢这个。
    • 顺便说一句,人们建议不要再在javascript中使用new ParentClass();方法进行继承了;见stackoverflow.com/questions/4152931/…
    • 谢谢,我知道整个newObject.create() 的辩论。两者的论点对我来说似乎有点迂腐。我可以很好地使用这两种技术。
    猜你喜欢
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 2011-05-23
    • 1970-01-01
    • 2011-02-19
    相关资源
    最近更新 更多