2015-10-15 14 views
7

Özel bir Broşür denetimi yazdım. Her katman için eklenebilecek bir çeşit efsane. Denetimin kendisini haritadan kaldırmak için bir kapatma düğmesi vardır (bir pop-up gibi). Kontrol, bir butona tıklayarak eklenebilir. Sorunum, kullanıcının aynı denetimi haritaya birkaç kez ekleyebilmesidir. Yani ihtiyacım olan şey, bu özel kontrolün zaten haritaya eklenmiş olup olmadığını test etmek ve eğer varsa, tekrar eklememek.Haritaya bir yaprakçık denetimi zaten eklenip eklenmediğini öğrenin

Ben

control.addTo(map); 

Şimdi kontrol kapatma düğmesi vardır hayal tıklayın bazı seçenekler

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

ve butona benim haritaya eklemek geçen her bir katman için bir denetim oluşturmak ve kapalı olabilir . Kullanıcı tekrar butona tıklarsa harita üzerinde halen açık değilse Şimdi, sadece denetim eklemek istiyorum - böyle bir şey (hasControl yalancı kod, hiçbir tür fonksiyon afaik vardır) yaptığım Kolaylık olması açısından

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

bir yakınlaştırma denetimi oluşturduğum ve iki kez here eklediğim bir örnek.

cevap

10

kolay yolu kontrol örneğinde _map özelliğinin varlığını kontrol etmektir: _map özelliğini kullanırken

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

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

map.addControl(customControl); 

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

Ama lütfen unutmayın, mülkiyet _ öneki o olduğunu ima normalde kullanmamanız gereken özel bir özellik. Broşürün gelecekteki sürümlerinde değiştirilebilir veya kaldırılabilir. senin L.Map örneğine

özel denetim başvuru ekleme:

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; 
    } 
}); 

Artık haritası örneğinde referans gibi kontrol edebilirsiniz Eğer takip yaklaşımını kullanırsanız o karşılaşmaya gitmiyorsun böylece:

if (map.customControl) { ... } 

Veya bir yöntem oluşturmak ve L.Map bunu şunlardır:

L.Map.include({ 
    hasCustomControl: function() { 
     return (this.customControl) ? true : false; 
    } 
}); 

şu şekilde çalışacak O:

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

map.addControl(customControl); 

map.hasCustomControl(); // returns true 

map.removeControl(customControl); 

map.hasCustomControl(); // returns false 

İşte Plunker üzerinde kavramının bir demo: http://plnkr.co/edit/nH8pZzkB1TzuTk1rnrF0?p=preview

+0

sayesinde, '_map' özelliği kullanılan - çalışıyor! tekne yüzer :) Ama mülkiyet '_' önek o normalde kullanmak gerekiyordu değil özel mülkiyet, olduğunu ima,' _map' özelliğini kullanırken göz önünde, bulundurun ne olursa olsun – Krxldfx

+0

. Broşürün gelecekteki sürümlerinde değiştirilebilir veya kaldırılabilir. Bu problemle ikinci yöntemle karşılaşmayacaksınız. Sadece :) tam olduğu, cevabım bu eklendi – iH8

+0

Eh, şimdi ikinci versiyona yakından vardı. Ben yapmazdım, ben bir customControl fazla varsa bu bir sorun olabilir mi? var customControl1 'gibi bir şey = Yeni L.Control.Custom (someOptions); var customControl2 = new L.Control.Custom (otherOptions); '- Şimdi hem ekleyebilir ve ilkini kaldırırsanız,' hasCustomControl' – Krxldfx

İlgili konular