OpenLayers 3 sửa đổi sự kiện kết thúc


9

Tôi muốn lưu dữ liệu hình học sau khi tôi sửa đổi nó, vì vậy tôi cần một sự kiện kích hoạt sau khi tôi hoàn thành để sửa đổi tính năng. Tôi sử dụng như sau từ bài viết này: người nghe sửa đổi tương tác

    var selected_features = select.getFeatures();
// when a feature is selected...
selected_features.on('add', function (event) {
    // get the feature
    var feature = event.element;
    feature.on("change", function (event) {
            logStatus(feature.getId() + " has been changed!\n");
    });
});

Nhưng người nghe này kích hoạt quá nhiều lần trong một lần sửa đổi và nếu tôi đang sử dụng 'một lần' thay vì 'bật' thì chỉ có một thay đổi nhỏ đầu tiên và không hơn, vì vậy nó không lưu thay đổi thực sự. Tôi cần một cái gì đó như "changeend" hoặc "sửa đổi" sẽ kích hoạt khi tôi hoàn thành để sửa đổi tính năng, tôi có thể sử dụng cái gì?


2
Đây là một hạn chế được biết đến. Một vấn đề GitHub đã được tạo ra cho điều đó gần đây: github.com/openlayers/ol3/issues/2946 .
erilem

Câu trả lời:


10

Nếu bạn cần một sự kiện sửa đổi tại sao bạn không sử dụng nó trong tương tác sửa đổi. (Tôi đoán bạn sử dụng một tương tác sửa đổi) hãy kiểm tra điều này

modify.on('modifyend',function(e){
console.log("feature id is",e.features.getArray()[0].getId());
});

Sự kiện này có sẵn trong các phiên bản mới nhất của ol3. Trong đoạn mã của tôi, tôi giả sử bạn chỉ sửa đổi một fetaure cùng một lúc (getArray () [0]). Nếu bạn sử dụng nhiều hơn một fetaure để sửa đổi cùng một lúc thì hãy lấy mảng fetaures và thêm một vòng lặp để thao tác thêm. Thích như vậy:

modify.on('modifyend',function(e){
var features = e.features.getArray();
for (var i=0;i<features.length;i++){
console.log("feature changed id is",features[i].getId());
}
});

5
Bạn nên xác định đó modifylà tên của Tương tác sửa đổi và modifyendmã của bạn xuất hiện sau khi xác định Tương tác: đầu tiên var modify = new ol.interaction.Modify({ features: select.getFeatures() });và sau đó là mã của bạn. selectlà tên của Tương tác Chọn của tôi. Ngoài ra, một nhà phát triển có thể làm e.features.getArray()[0].getGeometry().getCoordinates()hoặc e.features.getArray()[0].getGeometry().getType()để có được các hợp đồng hoặc loại. Câu trả lời tốt đẹp dù sao đi nữa.
slevin

3
Có thể tôi đang làm gì đó sai, nhưng với OL5, dường như e.features.getArray()[0].getId())luôn trả về cùng một id cho dù tính năng tôi đang sửa đổi là gì. Có cách nào khác để biết tính năng nào đã được thay đổi không?
Félix Gagnon-Grenier
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.