2015-10-15 5 views
7

私はカスタムリーフレットコントロールを作成しました。それは、各レイヤーに追加することができる何らかの伝説です。コントロール自体には、マップからポップアップのようなものを削除する閉じるボタンがあります。 コントロールを追加するには、ボタンをクリックします。 私の問題は、ユーザーが同じコントロールをマップに何度か追加することができることです。だから、私はこの特定のコントロールが既にマップに追加されているかどうかをテストし、もしそうなら、それを再度追加しないでください。リーフレットコントロールが既にマップに追加されているかどうかを調べる

は私が

control.addTo(map); 

今すぐコントロールが閉じるボタンを持っている想像してクリックし、いくつかのオプション

var control = L.control.customControl(mylayer); 

とボタンの私のマップに追加を渡し、それぞれの層のためのコントロールを作成して閉じることができます。今、ユーザーがもう一度ボタンをクリックした場合、私はそれが地図上まだない場合、コントロールを追加したい - このような何か(hasControlは擬似コードである、そのような機能は、私の知る限りではありません)簡単にするために

if(!(map.hasControl(control))) { 
    control.addTo(map); 
} 

私が作りましたズームコントロールを作成して2回追加する例here

答えて

10

最も簡単な方法は、あなたのコントロールインスタンス上_map財産の存在を確認することです:

var customControl = new L.Control.Custom(); 

console.log(customControl._map); // undefined 

map.addControl(customControl); 

console.log(customControl._map); // returns map instance 

しかし_mapプロパティを使用するときに、プロパティの_プレフィックスが、それはだということを意味することを、覚えておいてください。通常は使用しないプライベートプロパティです。今後のバージョンのリーフレットで変更または削除される可能性があります。あなたのL.Mapインスタンスにカスタムコントロールの参照を取り付け

:あなたがフォローのアプローチを使用している場合ということに遭遇するつもりはない

L.Control.Custom = L.Control.extend({ 
    options: { 
     position: 'bottomleft' 
    }, 
    onAdd: function (map) { 
     // Add reference to map 
     map.customControl = this; 
     return L.DomUtil.create('div', 'my-custom-control'); 
    }, 
    onRemove: function (map) { 
     // Remove reference from map 
     delete map.customControl; 
    } 
}); 

今、あなたはあなたのマップのインスタンスに参照をチェックすることができるようにそう:

if (map.customControl) { ... } 

またはメソッドを作成し、L.Mapに含める:

L.Map.include({ 
    hasCustomControl: function() { 
     return (this.customControl) ? true : false; 
    } 
}); 
このように動作します

var customControl = new L.Control.Custom(); 

map.addControl(customControl); 

map.hasCustomControl(); // returns true 

map.removeControl(customControl); 

map.hasCustomControl(); // returns false 

はここPlunker上の概念のデモです:http://plnkr.co/edit/nH8pZzkB1TzuTk1rnrF0?p=preview

+0

おかげで、私は '_map'プロパティを使用 - 正常に動作します! – Krxldfx

+0

あなたのボートは何でも浮かべています:)しかし、 '_map'プロパティを使うときには、プロパティの' _'接頭辞は、あなたが通常は使用しないプライベートプロパティであることを暗示しています。今後のバージョンのリーフレットで変更または削除される可能性があります。 2番目の方法では、この問題に遭遇することはありません。私の答えにこれを追加しました。ちょうど完成しました:) – iH8

+0

さて、私はもう2番目のバージョンを詳しく見ました。複数のcustomControlを持っていれば問題になるかもしれませんね。 'var customControl1 = new L.Control.Custom(someOptions);のようなものです。 var customControl2 = new L.Control.Custom(otherOptions); ' - 両方を追加して最初のものを削除すると、' hasCustomControl'はfalseを返します。 – Krxldfx

関連する問題