TL;DR
是 PinView.prototype = _.extend(PinView.prototype, google.maps.OverlayView.prototype)
从另一个“类”继承主干 View 的“正确”方式?
长读
我们正在使用 Backbone 重做我们的网站,并正在努力包括一些映射功能。
我有一个处理放置 <div>
的主干 View s 到浏览器窗口中的特定点;为了让 Google 的 Map API 将它们放置在地理坐标上,这似乎是一件很自然的事情。
根据Google API ,为了生成自定义覆盖,您创建一个新对象并将该对象的原型(prototype)设置为 google.maps.OverlayView 的新实例。然后,您在该对象之上实现三个函数,以便该对象响应:onAdd
draw
onRemove
在哪里 onAdd
负责生成 HTML,然后将其应用到 Map 之上。这随后调用 draw
根据您提供的 LatLng 对和边界正确定位元素。 onRemove
当你想摆脱你的层时被调用。
所以我修改了我的 View 以包含这三个方法(它们只是调用 render 和 unrender 并绑定(bind)到我的集合)。然后为了让“奇迹发生”,我正在做:PinView.prototype = _.extend(PinView.prototype, google.maps.OverlayView.prototype)
这看起来对吗?我可以发布 View 和它所基于的模型的代码,但老实说,它们与这个示例无关——代码有效,我可以放置自定义 div
s 通过 map 上的 Backbone 模型、 View 和 Controller 组件生成,没有问题,我想我在问什么(也许这个问题对程序员来说更合适,所以让我知道,我会移动它)。
这似乎是让我的 PinView 既是主干 View 又是谷歌地图 OverlayView 的最简单方法,但我不是 100% 对原型(prototype)继承感到满意,以知道我是否在做“错误”的事情或在某个地方破坏了某事.
最佳答案
好主意!我通常对天气持怀疑态度,当一切正常时,你是否“正确”,所以如果你没有遇到阻碍,并且覆盖出现并做了应该做的事情,我会说你是.
不过,要仔细检查一件事:
这不是(也不能)是“真正的”多重继承——这个概念在基于原型(prototype)的语言中并不真正相关:一个方法的实现将不可避免地“获胜”并覆盖另一个实现,至少在使用时_.extend()
这意味着如果 Backbone.View
中存在同名的成员或方法和 google.maps.OverlayView
您的 _.extend()
中的最后一个call 将接管。但是当我使用 Chrome 的开发者工具检查它们时,我没有看到任何明显的这种碰撞。
所以我的建议:继续使用这个,只是测试了很多。我很想在某个时候看到这种技术的一个例子。
关于google-maps-api-3 - 将 Google map 自定义叠加层与主干 View 混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9102762/