2015-10-15 12 views
7

Napisałem niestandardowy formularz kontrolny ulotki. Jest to legenda, którą można dodać do każdej warstwy. Samo sterowanie ma przycisk zamykania, aby usunąć go z mapy (jak wyskakujące okienko). Kontrolę można dodać, klikając przycisk. Moim problemem jest to, że użytkownik może dodać tę samą kontrolę do mapy kilka razy. Potrzebuję przetestować, czy ta konkretna kontrola została już dodana do mapy, a jeśli tak, to nie dodawaj jej ponownie.Sprawdź, czy kontrola ulotek została już dodana do mapy

tworzę sterowanie dla każdej warstwy, przechodząc kilka opcji

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

i dodać go do mojego mapie na przycisk kliknij

control.addTo(map); 

Teraz wyobraź sterowanie posiada przycisk zamykania i może być zamknięty . Teraz, gdy użytkownik ponownie kliknie przycisk, tylko chcę dodać kontroli, jeśli nie jest już na mapie - coś takiego (hasControl jest pseudokod, istnieje AFAIK nie ma takiej funkcji)

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

Dla uproszczenia zrobiłem przykład, w którym tworzę kontrolkę powiększenia i dodam ją dwukrotnie: here.

Odpowiedz

10

Najprostszym sposobem jest sprawdzenie istnienia własności _map na instancji kontrolnej:

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

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

map.addControl(customControl); 

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

Ale proszę pamiętać, gdy za pomocą właściwości _map, że _ prefiks nieruchomości sugeruje, że jest to własność prywatna, której normalnie nie powinno się używać. Można go zmienić lub usunąć w przyszłych wersjach ulotki. Nie zamierzamy się spotkać, że jeśli stosowanie metody follow:

Zakładanie odniesienie swojego niestandardowego formantu z wystąpieniem 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; 
    } 
}); 

Teraz można sprawdzić za odniesienie instancji jak mapy tak:

if (map.customControl) { ... } 

Albo utworzyć metodę i umieścić go w L.Map:

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

To będzie działać tak:

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

map.addControl(customControl); 

map.hasCustomControl(); // returns true 

map.removeControl(customControl); 

map.hasCustomControl(); // returns false 

Oto demo koncepcji na Plunker: http://plnkr.co/edit/nH8pZzkB1TzuTk1rnrF0?p=preview

+0

Dzięki użyłem 'własność _map' - działa bez zarzutu! – Krxldfx

+0

Cokolwiek unosi Twoją łódź :) Należy jednak pamiętać, że podczas używania właściwości '_map', prefiks' _' właściwości oznacza, że ​​jest to własność prywatna, której normalnie nie powinno się używać. Można go zmienić lub usunąć w przyszłych wersjach ulotki. Nie będziesz miał do czynienia z tym problemem z drugą metodą. Dodano to do mojej odpowiedzi, aby być kompletnym :) – iH8

+0

Cóż, teraz przyjrzałem się drugiej wersji. Myślę, że może to być problem, jeśli mam więcej niż jedną kontrolkę customControl, czy nie? Coś jak 'var customControl1 = new L.Control.Custom (someOptions); var customControl2 = new L.Control.Custom (otherOptions); '- jeśli teraz dodaję oba i usunę pierwszy,' hasCustomControl' zwróci false. – Krxldfx

Powiązane problemy