0

*使用 Genia S 的代码。我已将我的“解决方法”附加到帖子的底部*

3 个小时的浏览论坛和尝试代码片段让我头晕目眩。我的主要问题是我不是程序员,我将代码拼凑在一起,直到我让它工作为止。任何解释或指导将不胜感激。变量、对象、数组在某些方面似乎都是一样的,我不明白其中的复杂性。

我想去掉这段代码的重复性(使用leafletjs作为构造函数)。复制/粘贴相同的代码 20-30 次似乎并不优雅:

var manholes = new L.TileLayer.WMS("http://wms.server.address", {
  layers: 'manholes',
  format: 'image/png8',
  transparent: true
});

var stormdrains = new L.TileLayer.WMS("http://wms.server.address", {
  layers: 'stormdrains',
  format: 'image/png8',
  transparent: true
});

continued for each layer I need to create

当我只在两个地方更改一个词(沙井、雨水管等....)时,这似乎是很多冗余代码。所以,我试图将这个过程简化为:

  var layerlist = ["manholes","stormdrains","gravitylines","pumpstations"];

  for (i = 0; i < layerlist.length; i++) {

    var layerlist[i] = new L.TileLayer.WMS("http://wms.server.address", {
      layers: layerlist[i],
      format: 'image/png8',
      transparent: true
    });

  };

请不要假设我知道我为什么使用_ __ _ _ 而不是 _ __ _;或者为什么我在应该做_ __ _ __ _ _时做_ ____。我通过承认我缺乏理解开始了这篇文章。


下面是我正在使用的代码。我没有按照 Genia 的建议推送到新数组,而是使用 window[] 创建新对象(我不知道这是如何工作的)。我使用 Genia 解决方案的问题是,在代码的更深处,leafletjs 抛出异常,试图使用 . 符号。如果这可以补救,我很高兴学习。感谢大家的帮助,感谢 Genia 的评论和回复。所有不好的做法和被屠杀的代码都是我自己做的,没有任何负面的东西应该归咎于 Genia。

var layerlist = ["manholes","stormdrains","gravitylines","pumpstations"];

for (var i = 0; i < layerlist.length; i++) {
  var name = String(layerlist[i])
  window[name] = new L.TileLayer.WMS(ramnode, {
    layers: name,
    format: 'image/png8',
    transparent: true
  });
};

现在我有四个新的独立对象,分别命名为沙井、雨水管、重力线、泵站,它们的行为与我以原始方式创建它们的方式完全相同(顶部的第一个代码示例)

4

2 回答 2

2
for (x = 0; i < layerlist.length; i++) {

var layerlist[i] = new L.TileLayer.WMS("http://wms.server.address", {
  layers: layerlist[i],
  format: 'image/png8',
  transparent: true
});

};

请注意您是如何声明 x 但随后在循环中使用 i 的?(这是一个循环,顺便说一句)。

大概如果你转换x= 0var i = 0(在这里声明 var 更安全,以防万一i你的代码中的某个地方有另一个全局范围内你会不小心踩到)你应该得到你需要的东西(假设你的其余代码指向一个叫做的东西L 此处未显示)。

哦,也是var layerList[i]错的。

首先,您要在循环外声明一个 layerList 数组,如下所示:

var layerList = new Array();

然后你可以通过添加到它

layerList[i]; // notice NO var here

所以结果是

 var layerList = new Array();
    for (var i = 0; i < layerlist.length; i++) {

    layerList[i] = new L.TileLayer.WMS("http://wms.server.address", {
  layers: layerlist[i],
  format: 'image/png8',
  transparent: true
});
};
于 2013-10-16T20:33:17.057 回答
0

我注意到的主要事情是在你的 for 构造函数 for( _ _) 你从 x=0 开始,然后切换到使用 i 作为你的迭代器变量。尝试在构造函数中用 i 切换 x ,看看是否能满足您的需求;因为除此之外,它看起来很像它应该工作。

于 2013-10-16T20:29:25.977 回答