我在Rails 4项目中使用PanoJS,我收到以下错误:
TypeError: this.getLevel(...) is undefined
[panojs/pyramid_imgcnv.js][1] Line 92
我感到困惑的是,该方法似乎只是在上面几行宣布。
我已将其作为PanoJS的问题提出,但我怀疑它只是Rails和Javascript之间的配置错误。我之前已经设置并使用Rails 3项目。我使用了相同的JS文件并以相同的顺序加载它们。我看不出有什么不同(除了Rails版本),但有一个版本有效,一个版本没有。
更新
该元素被声明为(为了简洁,我将数据部分留下了);
%div{ id: "image_viewer", class: "viewer", data: {} }
JS应该使用以下coffeescript触发,但目前我已将其注释掉,因为它只是添加了一个错误,因为addimagezoom无法正常工作。
jQuery(document).ready ($) ->
$('#zoomimage').addimagezoom
largeimage: $('#zoomimage').data('large-image-url'),
magnifiersize: [$('#zoomimage').data('scaled-x-dimension'),$('#zoomimage').data('scaled-y-dimension')],
zoomrange: [2, 10]
更新2:
我意识到我在原帖中犯了一个错误。触发器实际上如下所示。以上是我试图让不同的观众工作的人工制品。下面是真正的触发器。
createViewer viewer, 'image_viewer', "#{url_base}/#{image_id}", "#{image_uuid}_", width, height, target_format
答案 0 :(得分:4)
我认为问题在于jQuery实现..
jQuery(document).ready ($) ->
jQuery('#zoomimage').addimagezoom
largeimage: jQuery('#zoomimage').data('large-image-url'),
magnifiersize: [jQuery('#zoomimage').data('scaled-x-dimension'),
jQuery('#zoomimage').data('scaled-y-dimension')],
zoomrange: [2, 10]
我们启动jQuery
关键字后,必须使用相同而不是$
错误类似于jQuery实现错误。因为$将不会获取任何内容,并且会导致未定义的错误。
尝试此操作,如果有效,
我不是RUBY程序员的必须,但可以检查JS:)
答案 1 :(得分:1)
好的,如果没有能够看到所有代码都在运行,那真的很难。但作为Sherlock的崇拜者,我可以看到这一点:
错误表示this.getLevel(...)
的结果未在文件panojs/pyramid_imgcnv.js
的第92行定义。源文件声明:
ImgcnvPyramid.prototype.tile_filename = function( level, x_coordinate, y_coordinate ) {
var l = formatInt( this.getLevel(level).level , 3);
...
}
这意味着level
的值会在undefined
中生成getLevel()
的结果。检查getLevel()
我们可以看到:
ImgcnvPyramid.prototype.getLevel = function( level ) {
if (level<this._pyramid.length)
return this._pyramid[ level ];
else
return this._pyramid[ this._pyramid.length-1 ];
}
因此level
是:
A.未定义,或
B.指向未存在的阵列位置的负数,或
C.存储在数组_pyramid中该位置的值未定义
如果我们搜索调用函数ImgcnvPyramid.tile_filename
的任何实例,我们可以看到它在源代码中的任何其他位置都没有被调用。这意味着实现库的用户必须调用它。因此,让我们检查,(并假设)您正在以与演示页面相同的方式实现插件。
该演示会覆盖tileUrlProvider.assembleUrl
方法。当您想要覆盖要使用的每个磁贴的URL时,应该实现此功能。在演示实现中,我们可以看到:
var myProvider = new PanoJS.TileUrlProvider('','','');
myProvider.assembleUrl = function(xIndex, yIndex, zoom) {
return MY_URL + '/' + MY_PREFIX + myPyramid.tile_filename( zoom, xIndex, yIndex );
}
如果我们遵循源代码中的跟踪,则传递到用户定义的zoom
方法的assembleUrl
变量应为undefined
或负值,假设加载时发生错误,可能是错误地计算了缩放级别。有罪的行可能:
PanoJS.js[88]
this.zoomLevel = (typeof options.initialZoom == 'undefined' ? -1 : parseInt(options.initialZoom));
根据这个&#34; analisis&#34;这是有道理的。因为返回的默认值是-1
。总而言之,在初始化全景图时包含initialZoom值
viewer = new PanoJS(dom_id, {
initialZoom: 0, // and play with this value to see what happens
...
});
另外,请检查触发器中width
和height
的值
createViewer viewer, 'image_viewer', "#{url_base}/#{image_id}", "#{image_uuid}_", width, height, target_format
如果其中一个是负数,零或未定义,则可能会在此过程中错误地计算缩放值。
很抱歉这么详细,这可能对其他人有所帮助,希望对你有所帮助。如果这些建议有效,请告知我们,如果没有,请发布我们可以看到代码运行的网址。