จะซิงค์ FeatureTable กับชุดตัวเลือกของ FeatureLayer ได้อย่างไร?


9

ArcGIS Server JS API มีคลาสFeatureTableใหม่ซึ่งแสดงตารางแอตทริบิวต์ที่สอดคล้องกับ FeatureLayer มีตัวเลือกsyncSelectionซึ่ง:

เปิดใช้งานการโต้ตอบระหว่างแผนที่และตารางคุณสมบัติ การตั้งค่าคุณสมบัตินี้เป็นจริงช่วยให้สามารถเลือกสถานที่บนแผนที่ผ่านการคลิกแถวในตารางและการเลือกแถวของตารางผ่านการคลิกสถานที่บนแผนที่

อย่างไรก็ตามสิ่งนี้ดูเหมือนจะไม่ให้เกียรติชุดการเลือกที่สร้างขึ้นโดยทางโปรแกรมกับเลเยอร์

จดตัวอย่างที่https://developers.arcgis.com/javascript/3/sandbox/sandbox.html?sample=featuretableหากฉันใช้การเลือกกับ FeatureLayer มันจะไม่ปรากฏใน 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)

สิ่งนี้ใช้การเลือกกับเลเยอร์สถานที่อย่างถูกต้อง (โปรดทราบว่าแผนที่มีเพียงจุดเดียวเท่านั้น) แต่ไม่ใช้กับตารางคุณลักษณะ (แสดงรายการทั้งหมด 1146 คะแนนด้วย 0 ที่เลือก):

ป้อนคำอธิบายรูปภาพที่นี่

มีวิธีในการรีเฟรชตารางคุณสมบัติเพื่อแสดงชุดการเลือกหรือไม่?


ตามที่ทราบไว้ฉันพยายามโทร myFeatureTable.grid.select () บนแถวที่ FID จับคู่กับผลการเลือกในการเรียกกลับของ featureLayer "selection-complete" และฉันวิ่งเข้าไปในการเรียกกลับแบบวงกลม อาจเพิ่มการตรวจสอบเพื่อดูว่าเลือกแถวหรือไม่ จะทำการวิจัยเพิ่มเติมในภายหลัง
raykendo

คำตอบ:


2

เริ่มต้นที่ 3.16 และใหม่กว่าการนำไปใช้ของSyncSelectionบูลีนนั้นแตกต่างจากที่คุณอธิบายไว้เล็กน้อย:

เปิดใช้งานการโต้ตอบระหว่างแผนที่และตารางคุณสมบัติ การตั้งค่าคุณสมบัตินี้เป็นจริงช่วยให้สามารถเลือกสถานที่บนแผนที่ได้ด้วยการคลิกแถวในตาราง อย่างไรก็ตามจะไม่เปิดใช้งานการเลือกบันทึกในตารางเมื่อผู้ใช้คลิกที่สถานที่บนแผนที่ ในการเปิดใช้งานการเลือกจากแผนที่ไปยังตารางนักพัฒนาจะต้องใช้ตรรกะการคลิกของเลเยอร์อย่างชัดเจน นี่เป็นเพราะแอปพลิเคชันอาจมีตรรกะการเลือกของตัวเองที่อื่นหรือตรรกะการคลิกของตัวเอง (เพิ่มที่ v3.16)

ดังนั้นฉันรู้ว่ามันเป็นความเจ็บปวดที่ยิ่งใหญ่ แต่ฉันเชื่อว่าคุณต้องวนลูปผ่านคุณสมบัติแผนที่เลเยอร์ที่เลือกและเลือกพวกเขาอีกครั้งโดยโทรเหตุการณ์การคลิกเลือกพวกเขา (โดยทางโปรแกรม)


2

นี่เป็นวิธีแก้ปัญหาสำหรับการดูเฉพาะสิ่งที่มองเห็นบนแผนที่ (ในมุมมอง :)

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

1

Hook กับselection-completeเหตุการณ์การใช้getSelectedFeatures()แผนที่ผลไปยังอาร์เรย์ของรหัสและผ่านที่ไปผ่านFeatureTable selectRowsจากนั้นselectFeaturesไปที่clickกิจกรรมและทำเสร็จแล้ว

ในฐานะที่เป็นความคิดคร่าว ๆ :

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);
    });
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.