6

TL定义叠加; DR混合谷歌地图与骨干网访问量

PinView.prototype = _.extend(PinView.prototype, google.maps.OverlayView.prototype)“正确”的方式有了主心骨查看从另一个“类”继承?

龙阅读

我们重做使用主干我们的网站和包括一些映射功能正在工作。

我有一个Backbone视图,用于处理将<div> s放置到浏览器窗口中的特定点上;这似乎是一个很自然的事情,为了让Google的Map API把它们放在地理坐标上。

根据Google API,为了生成自定义覆盖图,您需要创建一个新对象并将该对象的原型设置为google.maps.OverlayView的新实例。然后,您可以实现对物体的前三大功能,使对象响应:

onAdd

draw

onRemove

哪里onAdd负责生成HTML,然后将它放到最上面的地图。随后调用draw,根据LatLng对和您提供的边界正确定位元素。 onRemove当你想摆脱你的图层时被调用。

所以我修改了我的视图以包含这三个方法(它们只是调用render和unrender并绑定到我的集合)。然后让“魔术发生”我做:

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

这是否正确?我可以发布视图和它所基于的模型的代码,但老实说,它们与这个例子无关 - 代码可以工作,我可以将通过Backbone模型,视图和控制器组件生成的自定义div在地图上没有问题,我问我猜(也许这个问题更适合程序员。所以让我知道,我会移动它)。

这似乎是使我的PinView既是一个Backbone View又是一个Google Maps OverlayView的最简单的方法,但我并不是100%满意于原型继承来知道我是在做一些“错误的”在路的某个地方。

+0

嗯,它可能实际上是干净的PinView作为BackboneView与谷歌地图OverlayView作为PinView的一个属性链接到该覆盖层不知道有关谷歌内部的类,因为它们有点被所有缩小模糊 - 但我想我宁愿避免混合这两个,因为它们是不同类型的类和谁 知道会发生什么(尽管如果它有效,请告诉我们!)。一些我完全喜欢尝试玩更多 - 如果我只有时间呃! – 2012-02-03 12:38:46

+0

它正在工作,我想我的问题更多的是“你是如何使用原型继承进行多重继承”而不是“我应该真的这么做吗?”骨干的东西是超级干净的,所以我不担心某种原型命名空间冲突,并且当谷歌的源代码被缩小,当你在调试器中玩它的时候,OverlayView()的原型,对象实际上也非常简单。 – tkone 2012-02-03 12:49:35

回答

2

不错的主意!我通常对天气有些怀疑,或者在事情发生的时候你没有“正确”,所以如果你没有遇到困难,覆盖层显示出来并且做了应该做的事我会说你是。

有一点要检查仔细,虽然:

这不是(也不能)是“真正的”多重继承 - 这个概念是不是在一个基于原型的语言真正相关:一个执行方法将不可避免的“双赢”,并覆盖其他实现,至少使用_.extend()

时,这意味着,如果有成员或方法在你的_.extend()呼叫Backbone.View相同的名称和google.maps.OverlayView一个最后会接管的人。但是当我使用Chrome的开发者工具检查他们时,我没有看到这种明显的冲突。

所以我的建议:继续使用这个,只是测试了很多。我很乐意看到这种技术的一个例子。

1

啊!所以我一直在做上述,但从来没有感觉过。

后来我发现this discussion on a Backbone group这使我对以下几点:

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

这样,如果我们需要重写任何定义在一个类中我们extend来自ING,我们可以因为它早在_.extend链(后来的定义覆盖了早期的定义)。

我正在'扩展'extend以跟踪将被覆盖的“父”对象的引用,并提供一种方法来调用它们(如Python的super调用)。我还没有决定是否应该通过猴子补丁,intercepter模式(通过下划线的_.tap()方法或其他方式,但我认为它会增加很多灵活性。)

这将允许您定义initialize查看你的“父母”班,这可以通过做一些像_.super('ParentClass', 'initialize');在“子”班的initialize例程结束时调用...

+0

tkone:感谢您的更新答案,可否请您发布您的工作代码,我也试图使用OverlayView与骨干视图和未成功在它..我喜欢这种方式,但由于某种原因,我似乎无法得到它上班。 – user1271518 2012-08-25 16:15:23

+0

在更高版本的下划线(例如1.1.2)中,'_.extend'不能按预期工作。你将不得不使用自定义的扩展方法(我从下划线1.0.0复制它) – 2014-12-23 14:49:11

+0

@Koen。因为像semver?何必! – tkone 2014-12-23 16:30:47