Canvas只绘制地图上循环的最后一个元素
Canvas only drawing last element of loop on map
我使用Icon。帆布在传单地图上用帆布画标记。我遇到了问题,我假设这与"循环关闭"有关,但我似乎无法使用任何其他解决方案,因为在创建一个普通画布和它的上下文和我正在做的事情(画布元素和ctx是由图标创建的)的差异。帆布库)。
for (var park in parksMap) {
var circle = new L.Icon.Canvas({
iconSize: new L.Point(50, 50)
});
var item = parksMap[park];
var total = item.kpis.availability.online + item.kpis.availability.offline + item.kpis.availability.noComm;
var greenSize = item.kpis.availability.online * 2 / total;
var redSize = item.kpis.availability.offline * 2 / total;
console.log('OUTSIDE');
console.log(item);
circle.draw = function (ctx, w, h) {
console.log('INSIDE');
console.log(item);
setUpParkForStatus(item, ctx, greenSize, redSize);
parkWindConstructor(ctx);
ctxArray.push({
id: item.id,
ctx: ctx
});
} ...
(code continues on to create the actual markers)
}
setUpParksStatus是具有绘图实际代码的函数。以下是控制台的结果。日志以便更好地理解:
OUTSIDE
park1
OUTSIDE
park2
INSIDE
park2
INSIDE
park2
您可以使用返回包含当前逻辑的函数的IIFE
,因此当时的值不会受到循环的影响。
编辑:当进入ES2015
时,您可以使用let/const代替var
来实现您当前的代码,因为它是block-scoped
而不是function-scoped
。
If库可以使用下划线。如果不能,你仍然可以使用Object.keys()作为Array
获取键,然后使用.forEach
进行循环,所有这些方法都可以防止在循环中获得的值随着循环的推进而改变。
失败的演示,和IIFE修复:
'use strict';
var obj = {
'a': 1,
'b': 2,
'c': 3
};
var funcArr1 = [];
var funcArr2 = [];
var k, func1, func2;
for (k in obj) {
// Way 1, all point to last.
func1 = function() {
console.log(k, obj[k]);
};
// Snapshot it
// The wrap function will be called imediately, and it'll return the function similar to func1
// But the outer function creates a scope, which stores the k(and rename it to v to avoid ambiguous)
// So all the func2s will point to each key in obj instead of last.
func2 = (function(v) {
return function() {
console.log(v, obj[v]);
};
})(k);
funcArr1.push(func1);
funcArr2.push(func2);
}
// IN ES2015, you can use let to achieve:
var funcArr3 = [];
var func3;
// The let, unlike var, is block scoped, so it can achieve what you expect in simpler form.
for (let m in obj) {
func3 = function() {
console.log(m, obj[m])
};
funcArr3.push(func3);
}
// To loop object with .forEach, which works on array.
var funcArr4 = [];
Object.keys(obj).forEach(function(key, index) {
funcArr4.push(function() {
console.log(key, obj[key]);
});
});
var i, length = funcArr1.length;
for (i = 0; i < length; ++i) {
console.log('Way1');
funcArr1[i](); // All of it will log c, 3, as k is pointing to c when exit the loop.
console.log('Way2');
funcArr2[i]() // Because we use a function to keep k, it'll log what we expect.
console.log('Way ES2015');
funcArr3[i](); // Because we use a function to keep k, it'll log what we expect.
console.log('Way forEach');
funcArr4[i](); // Because we use a function to keep k, it'll log what we expect.
}
Demo with forEach
:
var obj = {
'a': 1,
'b': 2,
'c': 3
};
var funcArr = [];
Object.keys(obj).forEach(function(key, index) {
funcArr.push(function() {
console.log(key, obj[key]);
});
});
var i, length = funcArr.length;
for (i = 0; i < length; ++i) {
console.log('Way forEach');
funcArr[i](); // Because we use a function to keep k, it'll log what we expect.
}
使用let
或ES2015
的演示(这需要一些非常现代的浏览器版本才能使代码片段工作),但是有能够将ES2015语法编译为ES5的转译器,以便在大多数浏览器上工作(例如:g:巴别塔):
'use strict'; // This make chrome to accept some ES2015 syntax
const obj = {
'a': 1,
'b': 2,
'c': 3
};
// IN ES2015, you can use let to achieve:
let funcArr = [];
// The let, unlike var, is block scoped, so it can achieve what you expect in simpler form.
for (let m in obj) {
funcArr.push(function() {
console.log(m, obj[m])
});
}
for (let i = 0, len = funcArr.length; i < len; ++i) {
console.log('Way ES2015');
funcArr[i](); // Because we use a function to keep k, it'll log what we expect.
}
你可以对circle.draw
做类似的事情:
// Now the current value that may be used by the callback won't change as loop advanced.
circle.draw = (function(item, total, greenSize, redSize) {
return function (ctx, w, h) {
console.log('INSIDE');
console.log(item);
setUpParkForStatus(item, ctx, greenSize, redSize);
parkWindConstructor(ctx);
ctxArray.push({
id: item.id,
ctx: ctx
});
};
})(item, total, greenSize, redSize);
相关文章:
- 表追加而不附加最后一个元素
- 如何查找流星集合中最后一个元素/对象的id
- 如何在使用Protractor测试时找到ng中继器的最后一个元素
- 在元素数组上循环只会影响最后一个元素
- 推特引导滚动间谍总是选择最后一个元素
- 选择页面上具有特定类的最后一个元素
- 检查 JQuery 每个函数中的最后一个元素
- 选择表中的最后一个元素
- forEach 仅执行数组的最后一个元素
- JavaScript,数组和函数 - 只有数组的最后一个元素有效
- jQuery - 选择具有相同 ID 的组的最后一个元素
- 第一个元素和最后一个元素之间的连续循环
- 在JavaScript数组中查找最后一个元素的计算效率最高的方法
- 将同一个元素追加到两个下拉列表中只会导致最后一个元素被追加
- 如何在jquery中读取Section中的最后一个元素
- 设置'字体大小'jQuery不处理所选Text的最后一个元素
- AJAX只将数组的最后一个元素传递给MVC 5控制器
- 移除嵌套数组的最后一个元素,并完成最后一个数组
- PHP:获取关联数组中最后一个元素
- jquery slideDown()遍历最后一个元素