2014-01-23 4 views
2

Я хочу создать специализированный тип объекта polygon, который обертывает или наследует класс google.maps.Polygon. Я хочу, чтобы у него было обычное событие edited, которое можно прослушать, в идеале, через обычный интерфейс addListener. Это можно сделать?Как создать пользовательские события для объектов google maps api v3?

ответ

7

Мне нравится ответ 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

+0

Я не знал о методе event.trigger. Думаю, мне это нравится лучше. –

+0

Кстати, люди не рекомендуют использовать новый метод ParentClass(); 'для наследования в javascript; см. http://stackoverflow.com/questions/4152931/javascript-inheritance-call-super-constructor-or-use-prototype-chain –

+0

Спасибо, я знаю обо всем 'new' и' Object.create() ' дебаты. Аргументы для кажутся мне немного педантичными. Я отлично работаю с любой техникой. –

2

В статье Google Developers под названием Fun with MVC мы находим два способа сделать это.

  1. В разделе Binding Properties мы узнаем, что всякий раз, когда метод set(property, value) вызывается на MVCObject, волшебная 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(). Следующий фрагмент кода выполняет то же самое, что и код выше.

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

Я предпочитаю метод # 2, потому что она включает в себя меньше черной магии.

+0

Спасибо, что поделились своими знаниями, но, кажется, что у Вас есть задал эти вопросы только по одной причине, чтобы дать свой собственный ответ. Поэтому, когда вас не интересуют ответы, было бы справедливо, если вы сэкономите время на пользователей, которые хотели бы дать ответ и разместить уведомление об этом в вопросе. –

+0

Однако, если вы хотите создать «класс», который наследуется от другого «класса», использование прототипа (как указано в ответе Стива Янсена) является лучшим подходом, потому что с вашей попыткой вы должны определить настраиваемое событие для каждого отдельного пример. –

+0

@ Dr.Molle - ответ на ваш собственный вопрос приемлем, и Джастину не нужно ничего добавлять к вопросу, чтобы объяснить это его намерение: http://stackoverflow.com/help/self-answer http: // blog. stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ – duncan

Смежные вопросы