Cara yang benar untuk menentukan jenis lapisan Leaflet?

8

Apa pendekatan yang benar (atau disarankan) untuk mengidentifikasi "tipe" lapisan dalam Leaflet / Javascript?

Saya dapat berhasil menggunakan layer instanceof, tetapi itu hanya bekerja ketika Anda tahu jenisnya pada waktu desain (yang saya harapkan biasanya terjadi).

map.eachLayer(function(layer) {
    console.log('_leaflet_id=' + layer._leaflet_id + ' is layer type= '+ getLayerTypeName(layer));

function getLayerTypeName(layer)
{
    if (layer instanceof L.Marker){
        return 'Marker';
    }
    else if (layer instanceof L.Tooltip){
        return 'Tooltip';
    }
    else if (layer instanceof L.esri.DynamicMapLayer){
        return 'DynamicMapLayer';
    }
    else if (layer instanceof L.esri.BasemapLayer){
        return 'BasemapLayer';
    }   
    else if (layer instanceof L.Layer){
        return 'Layer';
    }        
    else
    {
        return 'Unknown';
    }
}

Apakah ada pendekatan berbeda yang harus saya gunakan?

https://jsfiddle.net/CumminsJP/tb28qwpo/

Jay Cummins
sumber

Jawaban:

2

Ini sebenarnya bukan masalah Leaflet, tapi masalah umum dengan Javascript. Dan itu secara khusus menyangkut ketika Anda menginginkan nama objek. Sebagai perbandingan, ada banyak cara untuk melakukannya dengan aman (seperti pada contoh Anda).

Javascript tidak memiliki kelas, jadi Anda hanya bisa mengandalkannya

layer.constructor.name

Namun, jika Anda menggunakan kode yang diperkecil, nama konstruktor sering berubah (seperti yang juga diperkecil), sehingga tidak akan terbaca.

Beberapa lib menambahkan nama objek sebagai properti (Leaflet tidak), tetapi Anda jarang membutuhkannya sebagai teks.

Lihat https://stackoverflow.com/a/1249554 untuk diskusi lebih rinci.

Perhatikan bahwa Anda tidak boleh menggunakan nama-nama ini untuk apa pun dalam kode Anda (perbandingan / identifikasi) kecuali output langsung (debug), karena mereka tidak dapat diandalkan.

Senshi
sumber