Two lessons learned

Telling the compiler that object keys are numeric causes more harm
than good (see === comparison that could never be met though the
compiler didn't catch it).

Never use goog functions without reading the source first.  The
goog.array.sort method does nothing special sorting numeric strings
(so the zs array might be ['1', '10', '2'] here).
This commit is contained in:
Tim Schaub
2012-10-09 23:31:38 -06:00
parent ce1b99cb56
commit f8462460bf

View File

@@ -169,10 +169,10 @@ ol.renderer.dom.TileLayer.prototype.render = function() {
}
/**
* @type {Object.<number, Object.<string, ol.Tile>>}
* @type {Object.<string, Object.<string, ol.Tile>>}
*/
var tilesToDrawByZ = {};
tilesToDrawByZ[z] = {};
tilesToDrawByZ[String(z)] = {};
var tileRange =
tileGrid.getTileRangeForExtentAndResolution(mapExtent, mapResolution);
@@ -188,7 +188,7 @@ ol.renderer.dom.TileLayer.prototype.render = function() {
var key = tile.tileCoord.toString();
if (tile.getState() == ol.TileState.LOADED) {
tilesToDrawByZ[z][key] = tile;
tilesToDrawByZ[String(z)][key] = tile;
return;
} else {
if (!(key in this.loadingTiles_)) {
@@ -198,7 +198,7 @@ ol.renderer.dom.TileLayer.prototype.render = function() {
tile.load();
}
// TODO: only append after load?
tilesToDrawByZ[z][key] = tile;
tilesToDrawByZ[String(z)][key] = tile;
}
/**
@@ -210,10 +210,12 @@ ol.renderer.dom.TileLayer.prototype.render = function() {
tileGrid.forEachTileCoordParentTileRange(
tileCoord,
function(altZ, altTileRange) {
altZ = String(altZ);
var fullyCovered = true;
altTileRange.forEachTileCoord(altZ, function(altTileCoord) {
var tileKey = altTileCoord.toString();
if (tilesToDrawByZ[altZ] && tilesToDrawByZ[altZ][tileKey]) {
if (tilesToDrawByZ[altZ] &&
tilesToDrawByZ[altZ][tileKey]) {
return;
}
var altTile = tileSource.getTile(altTileCoord);
@@ -232,17 +234,16 @@ ol.renderer.dom.TileLayer.prototype.render = function() {
}, this);
/** @type {Array.<number>} */
var zs = goog.object.getKeys(tilesToDrawByZ);
goog.array.sort(zs);
zs.sort(function(a, b) {return a - b});
var fragment = document.createDocumentFragment();
var altFragment = document.createDocumentFragment();
var newTiles = false;
var newAltTiles = false;
for (var i = 0, ii = zs.length; i < ii; ++i) {
var tileZ = zs[i];
var tilesToDraw = tilesToDrawByZ[tileZ];
var tileZ = +zs[i];
var tilesToDraw = tilesToDrawByZ[String(tileZ)];
var tileOffset = this.getTileOffset_(tileZ, mapResolution);
for (var key in tilesToDraw) {
var tile = tilesToDraw[key];