Polymer JS与Rails Turbolinks发生冲突

尝试在启用Turbolinks的Ruby on Rails项目中使用PolymerJs。 聚合物组件的初始加载有效,但是当我单击链接时,新页面呈现,但我的Polymer组件未重新初始化。 相反,他们看起来好像根本没有运行JS。

我在标题中加载聚合物组件和平台,因此它们没有加载’页面更改’(这是turbolinks的工作原理 – 它只重新加载主体)。

假设我想在我的页面上’刷新’my-custom-element和core-ajax标签,我似乎可以通过执行以下操作来“伪装”它

custom_elements = document.querySelectorAll("my-custom-element, core-ajax ") for element in custom_elements element.parentNode.replaceChild(element.cloneNode(), element) 

我猜测有一种更惯用的方法可以做到这一点。 还尝试再次调用元素内的Polymer()调用,但没有成功。 它似乎正常启动,但没有附加shadowDom或任何其他活动,表明Polymer试图重新附加我的元素。 我也尝试过使用preventDispose,但这似乎不起作用,因为从服务器加载了一个全新的主体。

如何告诉Polymer / Platform重新初始化页面上的所有元素? 我应该打什么活动?

或者,如果不能这样做,如何初始化给定的聚合物元素。

为Turbolinks撰稿4.未经测试的Turbolinks 5

Turbolinks在通过replaceChild获取后取代了Document Body

https://github.com/rails/turbolinks/blob/master/lib/assets/javascripts/turbolinks.js.coffee#L97

 document.documentElement.replaceChild(body, document.body); 

这并不会触发“元素升级”,因为在这种情况下观察者似乎不会触发。

我提出了两种不同的解决方案来解决这个问题。

导入整个身体

 $(document).on "page:change", -> document.documentElement.replaceChild(document.importNode(document.body, true), document.body); 

仅导入特定的已注册聚合物元素

 $(document).on "page:change", -> for polymerElement in Polymer.elements for domElement in document.body.querySelectorAll(polymerElement.name) domElement.parentNode.replaceChild(document.importNode(domElement, true), domElement); 

更新

这似乎符合官方认可的处理这种情况的方式

https://groups.google.com/forum/#!msg/polymer-dev/WaWbepYW97Q/XE3SQTyvyCUJ

这也是一个很好的用例,说明为什么需要这一步骤

要了解为什么在采用时可能希望避免更改类型,请考虑将其中的元素移动到主文档中。 您可能不希望仅仅因为它移动到新文档而返回生命周期…