将Google地图自定义叠加层与Backbone Views混合使用

时间:2012-02-01 20:24:10

标签: google-maps-api-3 backbone.js underscore.js prototypal-inheritance

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的最简单方法,但是我对原型继承不是很满意,知道我是在做某些“错误”或在某处破坏某些东西在路上。

2 个答案:

答案 0 :(得分:2)

好主意!我通常对天气有点怀疑,或者当事情有效时你是'正确的'所以如果你没有碰到一个showstopper并且覆盖物出现并做了我应该做的事我会说你是

有一件事要仔细检查一下:

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

这意味着如果Backbone.Viewgoogle.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的操作来调用该视图...