如何使用 Polymer 生命周期钩子

How to use Polymer lifecycle hooks

我有一个包含视频的组件。我的组件嵌套在 dom-if 中,可以消失。发生这种情况时,视频(和声音)会继续播放。

有没有一种方法可以让我的组件检测到它已从 DOM 中消失?我已尝试使用此处所述的 'detached' 回调:https://www.polymer-project.org/1.0/docs/devguide/registering-elements

Polymer({
  is: 'my-component-with-video',

  properties: {
     // some properties
  },

  detached: function() {
    console.log('Component detached');
    // more code to stop video
  },

但是当我的元素被 dom-if 删除时没有任何反应,我没有看到 console.log 消息。我做错了什么?

这里有两种可能的情况:

  1. 您希望您的元素在条件改变时被丢弃并重新创建。

  2. 您想将其保留在 dom 中,但将其冻结。

在第一种情况下,您需要将 restamp 属性添加到 dom-if 以确保模板 DOM 被销毁,而不是隐藏。默认情况下,dom-if 在第一次初始化时标记模板,然后在条件变为假时将其从视图中隐藏。

在第二种情况下,Intervalia给出的建议将不起作用,因为"hide"模式中的dom-if不会与DOM分离任何东西。设置 restamp 属性将使 detached 回调 运行 但随后没有必要暂停任何内容,因为该元素将被丢弃。 如果您想将其保持在 DOM 并冻结它的状态,您需要相应地在 dom-if 和 运行 上收听 dom-change 事件 .pause()

在您的分离函数中,您需要获取视频元素并对其调用 .pause()

您可能还需要在您的条件发生变化时调用 .pause(),这会导致 dom-if 移除播放器。

除了简单地使用 dom-if 而不是

之外,不需要任何解决方法
<dom-if if="[[condietionBoolean]]">
<your-video-element id="giveanId"></your-video-element>
</dom-if>

像下面这样编写 if 语句,这样每次您的条件发生变化时,您都会检查并确保视频在您喜欢的时候暂停。见下文。

...
<dom-if if="[[_shouldShowVideo(conditionBoolean)]]">
<your-video-element id="giveanId"></your-video-element>
</dom-if>

...

Polymer({
  is: 'my-component-with-video',

  properties: {

     conditionBoolean : {
        type: Boolean, 
     },

  },

_shouldShowVideo: function(conditionBoolean ) {
   if (!conditionBoolean) this.$$(#yourVideoElementId).pause();
   return conditionBoolean ;
}

});