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