我正在使用OpenLayers 4的生产(ol.js)和debug(ol-debug.js)版本。这些文件的来源是发布页面中的-dist.zip
(npm包都不兼容)我们的浏览器工作流程。)
我正在添加基于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?
答案 0 :(得分:2)
在生产版本中只有标有@api
的属性才可用。更确切地说:
OpenLayers API由
组成
- 构造函数的名称和签名
- 实例方法和属性的名称和签名
- 职能的名称和签名
- 常量名称
http://openlayers.org/en/latest/apidoc/
因此,如果您尝试扩展或使用未标记为api的属性,则无法在生产版本中使用该属性。
然而,有很多方法可以达到你想要的效果。
您可以使用Closure Compiler与OpenLayers一起构建代码。这在tutorial中有解释。这样,您可以访问任何非私人财产,并随意扩展。此外,您还可以最大限度地减少代码并检查"" (对于错误),这很酷。
如果您要使用/扩展的属性是私有的或无法访问,您仍然可以分叉OpenLayers,应用您自己的修补程序来制作您想要的内容(将其标记为@api
,示例)并生成您自己的定制生产版本。
无论您选择做什么,都不要犹豫,查看OpenLayers本身的源代码。如果某个媒体资源未标记为@api
,请将其视为"不可用"对于使用官方版本的OpenLayers打包的默认JS。