Javascript在匿名函数中分配变量的值

时间:2015-12-17 23:54:31

标签: javascript openlayers

我试图为OpenLayers创建多个图层。我遍历数组并使用typename: 'Test:' + item.ServiceName为每个值分配值。问题是当OpenLayer调用函数时它会抓取item.ServiceName的最后一个赋值,它总是" Test_Layer_3"所以不使用Test_Layer_1和Test_Layer_2。

如何更改它以便将Test_Layer_1,Test_Layer_2,Test_Layer_3分配给typename?

    var _MyLayers = [];
    _MyLayers.push({ "Id": 0, "ServiceName": "Test_Layer_1" });
    _MyLayers.push({ "Id": 1, "ServiceName": "Test_Layer_2" });
    _MyLayers.push({ "Id": 2, "ServiceName": "Test_Layer_3" });

    for (var i = 0; i < _MyLayers.length; i++)
    {
        var item = _MyLayers[i];

        var sourceVector = new ol.source.Vector({
            loader: function (extent)
            {
                $.ajax('http://localhost/geoserver/wfs', {
                    type: 'GET',
                    data: {
                        service: 'WFS',
                        version: '1.1.0',
                        request: 'GetFeature',
                        typename: 'Test:' + item.ServiceName,
                        srsname: 'EPSG:3857',
                        outputFormat: 'application/json',
                        bbox: extent.join(',') + ',EPSG:3857'
                    }
                });
            },
            strategy: ol.loadingstrategy.tile(new ol.tilegrid.createXYZ({})),
        });
        var layerVector = new ol.layer.Vector({
            source: sourceVector,
            minResolution: 0,
            maxResolution: 2,
            style: new ol.style.Style({ stroke: new ol.style.Stroke({ color: "rgba(25, 163, 255, 1.5)", width: 1 }) })
        });

        _MapLayers.push(layerVector);
    }

2 个答案:

答案 0 :(得分:1)

item.ServiceName替换为_MyLayers[i].ServiceName可以有效。

说明

当您定义loader个功能时,并不意味着此时item.ServiceName已分配给typename。相反,该函数会保留一个指向item变量(类型)的链接,然后链接回_MyLayers[i] - 全局变量。

当OpenLayers为每个对象调用loader函数时,'Test:' + item.ServiceName,将被评估并分配给typename,其中item表示的值已经更改。它现在将指向最后一项(例如_MyLayers[3]),因为它是分配的最后一个值item

通过替换上面的行,loader函数现在每个都保持一个直接连接到全局_MyLayers的唯一链接。由于i是一个数字,每个加载器函数在i循环中定义函数时基于for的值实现一个语句(例如_MyLayers[1],{ {1}},......等等。)

答案 1 :(得分:0)

我最终将item.ServiceName的值分配给sourceVector。然后在loader函数中读取sourceVector的值。