Bagaimana cara menyinkronkan FeatureTable dengan set pilihan FeatureLayer?

9

ArcGIS Server JS API berisi kelas FeatureTable baru , yang memperlihatkan tabel atribut yang terkait dengan FeatureLayer. Ada pilihan syncSelection yang:

Mengaktifkan interaksi antara peta dan tabel fitur. Mengatur properti ini menjadi true memungkinkan pemilihan fitur pada peta melalui mengklik baris pada tabel, dan pemilihan baris tabel melalui mengklik fitur pada peta

Namun, ini tampaknya tidak menghormati set pilihan yang dibuat secara terprogram terhadap layer.

Mengambil sampel di https://developers.arcgis.com/javascript/3/sandbox/sandbox.html?sample=featuretable , jika saya menerapkan pilihan pada FeatureLayer, itu tidak tercermin dalam FeatureTable:

// Create the feature layer
myFeatureLayer = new FeatureLayer("https://services.arcgis.com/V6ZHFr6zdgNZuVG0/arcgis/rest/services/Warren_College_Trees/FeatureServer/0", {
  mode: FeatureLayer.MODE_SELECTION,
  visible: true,
  outFields: ["*"],
  id: "fLayer"
});
var myQuery = new Query();
myQuery.where = "Spp_Code ='SABA'";
myFeatureLayer.selectFeatures(myQuery,FeatureLayer.SELECTION_NEW)

Ini dengan benar menerapkan pemilihan ke lapisan fitur (perhatikan bahwa peta hanya berisi satu titik), tetapi tidak ke tabel fitur (ini mencantumkan semua 1.126 poin dengan 0 dipilih):

masukkan deskripsi gambar di sini

Apakah ada cara untuk me-refresh tabel fitur untuk mencerminkan set pilihan?

Stephen Lead
sumber
Sebagai catatan, saya mencoba menelepon myFeatureTable.grid.select () pada baris di mana FID cocok dengan hasil seleksi pada callback featureLayer "selection-complete", dan saya mengalami panggilan balik melingkar. Mungkin menambahkan tanda centang untuk melihat apakah baris dipilih atau tidak akan berhasil. Akan diteliti lebih lanjut nanti.
raykendo

Jawaban:

2

Mulai dari 3.16 dan kemudian, implementasi SyncSelectionboolean itu sedikit berbeda dari yang Anda jelaskan:

Mengaktifkan interaksi antara peta dan tabel fitur. Menyetel properti ini menjadi true memungkinkan pemilihan fitur pada peta melalui mengklik satu baris dalam tabel. Namun, itu tidak akan mengaktifkan pemilihan catatan di tabel ketika pengguna mengklik fitur di peta. Untuk mengaktifkan seleksi dari peta ke tabel, pengembang harus secara eksplisit menerapkan logika klik layer. Ini karena aplikasi mungkin memiliki logika pemilihan sendiri di tempat lain atau logika klik sendiri. (Ditambahkan pada v3.16)

Jadi, saya tahu ini adalah masalah besar, tetapi saya yakin Anda harus mengulang-ulang fitur layer-map yang dipilih dan memilihnya LAGI dengan memanggil event klik pilihan pada mereka (secara terprogram).

JasonInVegas
sumber
2

Ini adalah solusi saya untuk hanya melihat apa yang terlihat di peta (dalam tampilan :)

    _selectViewIds: function() {
        var objectIdFieldName = this.layer.layerObject.objectIdField;
        q = new Query();
        q.outFields = [objectIdFieldName];
        q.geometry = this.map.extent;
        var exp=this.layer.layerObject.getDefinitionExpression();
        q.where = exp;
        q.returnGeometry = true;
        new QueryTask(this.layer.layerObject.url).execute(q).then(lang.hitch(this, function(ev) {
            var selectedIds = ev.features.map(function(f) {return f.attributes[objectIdFieldName];});

            this.myFeatureTable.filterRecordsByIds(selectedIds);
        }));
    }

...

        on(selectFeaturesBtn, 'change', lang.hitch(this, function(ev) {
            if(selectFeaturesBtn.isChecked()) {
                this._selectViewIds();
                on(this.map, "extent-change", lang.hitch(this, this._selectViewIds, this));
            } else {
                this.myFeatureTable.clearFilter();
            }
        }));
horiatu
sumber
1

Kaitkan ke selection-completeacara tersebut, gunakan getSelectedFeatures(), petakan hasilnya ke berbagai ID, dan sampaikan ke FeatureTablevia selectRows. Kemudian kaitkan selectFeatureske clickacara dan Anda selesai.

Sebagai ide kasar:

layer.on("click", function(evt) {
    var query = new Query();
    query.geometry = evt.mapPoint;
    layer.selectFeatures(query, FeatureLayer.SELECTION_NEW, function() {
        var ids = layer.getSelectedFeatures().map(function(feature) {
            return feature.attributes[objectIDFieldName];
        });
        featureTable.selectRows(ids);
    });
}
Kyte
sumber