6

TL; DRMezcla mapas de Google superposiciones personalizadas con Backbone Vistas

¿Es PinView.prototype = _.extend(PinView.prototype, google.maps.OverlayView.prototype) la forma "correcta" de tener una columna vertebral Ver heredan de otra "clase"?

lectura larga

Estamos rehaciendo nuestro sitio usando Backbone y estamos trabajando en la inclusión de algunas funciones de mapeo.

Tengo una vista Backbone que maneja la colocación de <div> s en puntos específicos dentro de la ventana del navegador; esto parece algo natural de ampliar para que el Map API de Google los ubique en coordenadas geográficas.

De acuerdo con Google API, para generar una superposición personalizada crea un nuevo objeto y establece el prototipo para ese objeto en una nueva instancia de google.maps.OverlayView. A continuación, poner en práctica tres funciones en la parte superior de ese objeto para que el objeto responde a:

onAdd

draw

onRemove

Dónde onAdd es responsable de generar el código HTML y luego aplicarlo en la parte superior del mapa. A continuación, llama al draw, que posiciona el elemento correctamente de acuerdo con los pares y límites LatLng que ha proporcionado. onRemove se llama cuando desea deshacerse de su capa.

Así que modifiqué mi vista para incluir estos tres métodos (que solo llaman a renderizar y deshacer y están vinculados a mi colección). Y después de hacer "que la magia suceda" Estoy haciendo:

PinView.prototype = _.extend(PinView.prototype, google.maps.OverlayView.prototype)

se ve este derecho? Puedo publicar el código para la Vista y el Modelo en el que se basa, pero, sinceramente, son irrelevantes para este ejemplo: el código funciona y puedo colocar div personalizados generados a través del modelo Backbone, la vista y los componentes del controlador en el mapa sin problema, lo que estoy preguntando, supongo (y tal vez esta pregunta sea más apropiada para los programadores. Por lo tanto, avíseme y la moveré).

Esta parece ser la manera más fácil de hacer que mi PinView sea una Vista Backbone y una Vista de superposición de Google Maps, pero no estoy 100% cómodo con la herencia prototípica para saber si estoy haciendo algo "incorrecto" o rompiendo algo en algún lugar del camino.

+0

Hm, que podría ser en realidad más limpio para hacer una PinView como BackboneView con los mapas de Google OverlayView como una propiedad en el PinView vinculado a esa superposición. No estoy seguro acerca de las clases internas de google, ya que están oscurecidas con todas las minificaciones, pero creo que prefiero evitar mezclar estas dos ya que son clases de tipos y tipos diferentes. quien sabe lo que podría pasar (aunque si funciona, ¡háganoslo saber!). Algo que me encantaría probar con un poco más, si tuviera el tiempo ¡Eh! –

+0

Está funcionando, supongo que mi pregunta era más "¿es así como se hace una herencia múltiple usando herencia prototípica" que "debería realmente estar haciendo esto?" Las cosas de Backbone son súper limpias y bien pensadas, así que no estoy preocupado por algún tipo de colisión del espacio de nombres Prototype, y aunque la fuente de Google está minimizada, cuando juegas con ella en el depurador, el prototipo para OverlayView() objeto es en realidad muy simple también. – tkone

Respuesta

2

¡Bonita idea! Normalmente soy un poco escéptico sobre el clima o no eres 'correcto' cuando las cosas funcionan, así que si no te has encontrado con un showtopper y las superposiciones se muestran y hace lo que se supone que haga, diría que eres .

Una cosa que echa un vistazo más de cerca, sin embargo:

Esto no es (y no puede) ser "verdadera" herencia múltiple - que este concepto no es realmente relevante en un lenguaje basado en prototipos: una implementación de un método será inevitable "ganar" y sobrescribir la otra aplicación, al menos cuando se utiliza _.extend()

Esto significa que si hay miembros o métodos con los mismos nombres en Backbone.View y google.maps.OverlayView el última en su llamada _.extend() será el que toma el control. Pero cuando los inspecciono usando las herramientas para desarrolladores de Chrome no vi ninguna colisión obvia de este tipo.

Así que mi recomendación: continúe usando esto, solo pruebe mucho. Me encantaría ver un ejemplo de esta técnica en algún momento.

1

¡Ah! Así que he estado haciendo lo anterior, pero nunca se sintió bien.

Entonces me encontré con this discussion on a Backbone group que me lleva a la siguiente:

var MyView = (function(){ 
    var view = function(){ 
     Backbone.View.apply(this, arguments); 
    }; 

    view.extend = Backbone.View.extend; 

    _.extend(view.prototype, Backbone.View.prototype, google.maps.OverlayView.prototype, [other prototypes...], { [VIEW DEFINITION] }); 

    return view; 
}()); 

De esta manera si tenemos que reemplazar cualquiera de las definiciones en una clase que estamos extend ing de, podamos ya que es anterior en el _.extend cadena (las definiciones posteriores sobrescriben definiciones anteriores).

Estoy trabajando en 'extender' extend para hacer un seguimiento de las referencias del objeto "principal" que se anularían y proporcionando un método para llamarlas todavía (como la llamada de Python super). No he decidido si esto debería hacerse a través de parche de mono, un patrón de interceptor (mediante el método de subrayado _.tap() u otra cosa, pero creo que agregará mucha flexibilidad.

Esto le permitiría definir un initialize vista en su clase "padre" que podría llamarse haciendo algo como _.super('ParentClass', 'initialize'); al final de la rutina de "niño" de la clase initialize ...

+0

tkone: gracias por su respuesta actualizada, ¿podría publicar su código de trabajo, también estoy tratando de usar OverlayView con vista de red troncal y sin éxito en ello ... me gusta de esta manera, pero por alguna razón no puedo entenderlo trabajar. – user1271518

+0

En versiones posteriores de guión bajo (por ejemplo, 1.1.2), '_.extend' no funciona como se esperaba. Tendrás que usar un método de extensión personalizado (lo copié desde el guión bajo 1.0.0) –

+0

@Koen. porque como sempre? ¡por qué molestarse! – tkone

Cuestiones relacionadas