流星和聚合物,是什么导致了这种行为?

Meteor and Polymer, what is causing this behaviour?

我正在尝试开始将 Polymer 与 Meteor 结合使用,但看到了以下我无法解释的行为。

复制 git 克隆 https://github.com/JeremyKells/meteor-polymer-testing.git 和 运行 流星。

这只是使用以下方法创建的应用程序:

meteor create testpoly 

然后使用 bower 添加聚合物组件:

bower install --save Polymer/polymer
bower install --save PolymerElements/iron-elements
bower install --save PolymerElements/paper-elements

并将该部分添加到代码中。

这样 运行 没问题,但是如果您删除这两行中任何一行的注释:

<!-- <link rel="import" href="/bower_components/paper-dropdown/paper-dropdown.html"> -->
<!-- <link rel="import" href="/bower_components/paper-dialog/paper-action-dialog.html"> -->

该应用程序两次显示正常的流星计数器应用程序,如下所示: http://i.stack.imgur.com/KAv7Z.png

为什么会这样?我该如何阻止它?

Guissouma 回复后的更多信息。我在 Ubuntu 15.04 上 运行 宁此,主要是用 chrome 测试。当 UI 个元素重复时,单击任一按钮只会更新第二个 'counter',第一个计数保持为零。

而在同一环境下的 Firefox 上,只有一组 UI 元素,但按钮不起作用。

i.stack.imgur.com/bqumz.png

尝试在 iphone 上使用 Safari 和 Chrome 连接到此服务器给出与 firefox 相同的结果:它看起来不错,但按钮没有更新计数值。

我在 windows 上用流星测试了该项目,它按预期工作!我从 headers.html 中删除评论该应用程序显示正常的流星计数器应用程序。

在使用 firefox 的 ubuntu 15.0.4 上,按钮似乎不起作用,这是由于在 headers.html 文件中导入了 js 文件 webcomponents.js。 尝试在 headers.html 上评论此行并再次测试。

<!-- <script src="/bower_components/webcomponentsjs/webcomponents.min.js"></script> -->

这是从 Polymer 0.5 更改为 Polymer 1.0 时导入链接错误的情况。
应该是:

<link rel="import" href="/bower_components/paper-dropdown-menu/paper-dropdown-menu.html">
<link rel="import" href="/bower_components/paper-dialog/paper-dialog.html">

虽然我仍然不明白为什么这会导致 html 标签重复,以及为什么这不会在浏览器中引发错误,但当我获得正确的代码时,一切都会起作用!

tl;博士

确保您的 Polymer 和 PaperElements 依赖项是最新的。 (即使用 #^1.0.0 而不是 #1.0.0。)

详情

这个问题的根本原因有两个:

  1. 即使路径请求中没有资源,Meteor 也会以主页的内容进行响应,但是 does not use a 404 (Not Found) status code
  2. HTML 导入会将参考文档包含到页面 unless the response is an error

即使您使用的是 Polymer 也没关系。以下 Meteor 应用程序将出现重复行为:

<head>
  <link rel="import" href="bad-link.html">
</head>
<body>
  I'm Duplicated!<br>
</body>

解决方案是确保您的 HTML 导入有效。

在我的例子中,paper-icon-button.html 有一个 paper-behaviors/paper-radio-button-behavior.html 的导入,它在 paper-behaviors 的最新版本中不存在。

不一致的原因是因为 paper-icon-button 被锁定在版本 #1.0.0 但它自己的 bower 依赖引用 paper-behaviors#^1.0.0 这意味着 the latest version >= 1.0.0 and < 2.0.0.

解决方案是更改我的 bower 依赖项版本以也使用 semver caret syntax

{
  "dependecies": {
    "polymer": "Polymer/polymer#^1.2.0",
    "paper-icon-button": "PolymerElements/paper-icon-button#^1.0.0"
  }
}