聚合物霓虹灯动画页面会引发 TypeError,因为它的选定项未定义



我迷失在一个继承的项目上:一个Java应用程序的Web前端,在服务器上提供其数据。它包含许多未修复的错误,主要是从迁移到Polymer 1.0,这是前端工作人员在离开之前做的最后一件事。到目前为止,我已经将所有 npm 和 bower 依赖项更新到最新版本,并一直在查看自定义 HTML 和 JavaScript 部分中发生的大部分内容,但我只知道一些基本的 HTML 和 Java 无助于推动事情向前发展。

该区域的HTML结构大致如下:

<paper-scaffold id="scaffold" drawer-width="{{drawerWidth}}" responsive-width="{{responsiveWidth}}" mlist="{{mList}}> 
    <neon-animated-pages id="pages-blocks" class="flex" selected="{{selectedPage}}" entry-animation="{{entryAnimation}}" exit-animation="{{exitAnimation}}"> 
        <template is="dom-repeat" items="{{list}}" as="block" index-as="blockIndex">
            <neon-animatable> (content) </neon-animatable>
        </template>
    <neon-animated-pages>
</paper-scaffold> 

<paper-scaffold>是从<core-scaffold>衍生而来的定制脚手架。

在大多数情况下,整个装置按预期工作 - 您单击列表中的项目以选择它们,并将相应服务器对象的内容显示在前端的其他位置 - 除了列表中的第一个条目。它是这样的:

  • 选择第一个项目并正常处理
  • 一旦您尝试选择另一个项目,在第一个项目之后,选择将保留,并在霓虹灯动画页面中抛出错误.html: Uncaught TypeError: Cannot read property 'classList' of undefined .
  • 单击另一个项目会解冻选择(尽管再次抛出错误)
  • 从那时起,一切都恢复正常,直到再次选择第一个块

引发错误的行是在霓虹动画页面的_selectedChanged函数中观察变量selected,该变量随着每次单击选择新项目而变化。上面写着:

selectedPage.classList.add('neon-animating');


所以我去监控变量selectedPage,似乎在单击项目列表时发生了很多事情。

从除第一个项目以外的任何项目切换到另一个项目(包括第一个项目)时,_selectedChanged 被调用三次:

  1. selectedPage未定义,但函数退出,因为它找不到以前选择的页面,导致其停止
  2. selectedPage是预期的 [对象 HTMLElement],函数完成时没有错误
  3. selectedPage未定义,但函数退出,因为它找不到以前选择的页面,从而导致它停止

从第一个项目切换到另一个项目时,_selectedChanged被调用三次:

  • selectedPage是 [对象 HTMLElement],正如预期的那样,所有三次,并且函数完成时没有错误

当从第一个项目之后选择的项目切换到任何其他项目时,_selectedChanged被调用一次:

  1. selectedPage未定义但已知上一页,则会抛出错误

从该项切换到另一个项时,它看起来与正常情况相同(三次调用,两次未定义)并按预期工作,但无论如何都会引发错误。


我能找到的唯一未定义selectedPage的另一个实例是关于"更多路由"的问题报告,但此前端没有发生路由。

如果这一切都非常复杂,我很抱歉,但我才刚刚开始研究 Web 开发和聚合物,甚至找不到开始调试的地方,因为似乎发生了很多事情超出了我的范围。霓虹灯动画页面使用的任何变量都不会由"我的"代码主动分配。我很乐意提供可能有助于解决此问题的任何其他信息。

这本身不是一个答案,但我想我至少会留下一些见解,以防有人偶然发现这个问题。

正在发生的事情是,在我继承的混乱代码中,对_selectedChanged的三次调用来自三个不同的<neon-animated-pages>实例,这些实例都共享相同的索引,(通常)一次只能看到其中一个。它们都相互干扰,并干扰了代码的其他部分,在某些时候,我忘记了跟踪连接以修复所有内容。

我的"解决方案"是在完全没有动画的情况下重写代码,反正没有必要,事实上,我们想关闭它。现在,一个更纤薄(和评论)的<paper-drawer-panel>结构连接列表和内容。

相关内容

最新更新