由于缺少方法而导致PanoJS失败

时间:2014-07-10 12:56:50

标签: javascript ruby-on-rails

我在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

2 个答案:

答案 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
    ...
});

另外,请检查触发器中widthheight的值

createViewer viewer, 'image_viewer', "#{url_base}/#{image_id}", "#{image_uuid}_", width, height, target_format

如果其中一个是负数,零或未定义,则可能会在此过程中错误地计算缩放值。

很抱歉这么详细,这可能对其他人有所帮助,希望对你有所帮助。如果这些建议有效,请告知我们,如果没有,请发布我们可以看到代码运行的网址。