我使用的是OpenLayers 4的生产(ol.js)和调试(ol-debug.js)版本。这些文件的来源是来自releases页面的-dist.zip (这两个npm包都不与我们的browserify工作流兼容)。
我正在添加一个自定义的瓦片源,基于ol.source.Zoomify。
代码的结构如下所示(几乎是ol源代码中Zoomify的克隆):
var ol = require('openlayers')
var self = (module.exports = {
Gigapan: function(optOptions) {
// ...
var tileGrid = new ol.tilegrid.TileGrid({
extent: extent,
origin: ol.extent.getTopLeft(extent),
resolutions: zoomInfo.resolutions,
})
// ...
ol.source.TileImage.call(this, {
tileClass: myTile,
tileGrid: tileGrid,
tileUrlFunction: gigapanUrlFunction,
})
},
})
ol.inherits(self.Gigapan, ol.source.TileImage)
var myTile = function(tileCoord, state, src, crossOrigin, tileLoadFunction) {
ol.ImageTile.call(this, tileCoord, state, src, crossOrigin, tileLoadFunction)
this.zoomifyImage_ = null
}
ol.inherits(myTile, ol.ImageTile)
myTile.prototype.getImage = function() {
// ...
}这在-debug版本中工作得很好,但是在使用生产版本时会引发以下异常。
ol.js:16 Uncaught TypeError: Cannot read property 'prototype' of undefined
at Object.v [as inherits] (ol.js:16)
at Object.43../../../assets/non-npm/openlayers/ol.js (viewerTileFormats.js:168)指向ol.inherits(myTile, ol.ImageTile)的第二个ol.inherits。
这段代码有什么问题?我如何扩展OL4,使其与生产版本兼容?
发布于 2017-11-24 00:00:07
只有标记为@api的属性才能在生产版本中可用。更准确地说:
OpenLayers接口由以下部分组成
常量的constructors
的签名
http://openlayers.org/en/v4.6.5/apidoc/
因此,如果您试图扩展或使用未标记为api的属性,则不能在生产版本中使用该属性。
然而,有一些方法可以实现你想要的东西。
(1)在代码旁边构建OpenLayers
您可以使用Closure Compiler与OpenLayers一起构建您的代码。此tutorial中对此进行了说明。这样,您就可以访问任何非私有属性,并根据自己的喜好扩展它。此外,您还可以获得最小化和“检查”(检查错误)代码的好处,这是非常酷的。
编辑适用于OpenLayers 4.6.5版。
(2) Fork OpenLayers
如果您想要使用/扩展的属性是私有的或无法访问,您仍然可以派生OpenLayers,应用您自己的修复程序来使您想要的东西可用(例如,将它们标记为@api ),并生成您自己的定制生产版本。
无论您选择做什么,请毫不犹豫地查看OpenLayers本身的源代码。如果一个属性没有被标记为@api,那么对于OpenLayers的官方版本打包的默认JS来说,就认为它“不可用”。
https://stackoverflow.com/questions/47458549
复制相似问题