TL; DR
PinView.prototype = _.extend(PinView.prototype, google.maps.OverlayView.prototype)
是否有“正确”方式让Backbone View继承自另一个“类”?
长读
我们正在使用Backbone重做我们的网站,并正在努力包括一些映射功能。
我有一个Backbone视图,处理<div>
到浏览器窗口中的特定点;这似乎是一个自然的事情,以便谷歌的Map API将它们放置在地理坐标上。
根据Google API,为了生成自定义叠加层,您需要创建一个新对象,并将该对象的原型设置为google.maps.OverlayView的新实例。然后在该对象之上实现三个函数,以便对象响应:
onAdd
draw
onRemove
onAdd
负责生成HTML,然后将其应用于地图之上。随后调用draw
根据您提供的LatLng对和边界正确定位元素。当你想要删除你的图层时会调用onRemove
。
所以我修改了我的View以包含这三个方法(只调用render和unrender并绑定到我的集合)。然后让“魔术发生”我正在做:
PinView.prototype = _.extend(PinView.prototype, google.maps.OverlayView.prototype)
这看起来不错吗?我可以发布它所基于的View和Model的代码,但老实说,它们与这个例子无关 - 代码可以工作,我可以通过Backbone模型生成自定义div
,地图上的视图和控制器组件没有问题,我猜是什么(也许这个问题对于programmers.se更合适,所以让我知道,我会移动它。)
这似乎是让我的PinView同时成为Backbone View和Google Maps OverlayView的最简单方法,但是我对原型继承不是很满意,知道我是在做某些“错误”或在某处破坏某些东西在路上。
答案 0 :(得分:2)
好主意!我通常对天气有点怀疑,或者当事情有效时你是'正确的'所以如果你没有碰到一个showstopper并且覆盖物出现并做了我应该做的事我会说你是
有一件事要仔细检查一下:
这不是(也不可能)是“真正的”多重继承 - 这个概念在基于原型的语言中并不真正相关:方法的一个实现将不可避免地“赢”并覆盖其他实现,在至少在使用_.extend()
这意味着如果Backbone.View
和google.maps.OverlayView
中有成员或方法具有相同的名称,则_.extend()
来电中的 last 将是一个接管。但是当我使用Chrome的开发者工具检查它们时,我没有看到任何明显的碰撞。
所以我的建议:继续使用它,只需测试很多。我希望有一段时间能看到这种技术的一个例子。
答案 1 :(得分: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
的类中的任何定义,我们可以在_.extend
链中更早出现(后面的定义会覆盖之前的定义)。 / p>
我正在努力'扩展'extend
以跟踪将被覆盖的“父”对象的引用,并提供一种方法来调用它们(如Python的super
调用)。我还没有决定是否应该通过猴子修补,一个截取模式(通过下划线的_.tap()
方法或其他方式来完成),但我认为它会增加很多灵活性。
这将允许您在“父”类中定义initialize
视图,可以通过在“子”类的_.super('ParentClass', 'initialize');
例程结尾处执行类似initialize
的操作来调用该视图...