Polymer 聚合物2中的组分初始化顺序

Polymer 聚合物2中的组分初始化顺序,polymer,web-component,polymer-2.x,polymer-3.x,Polymer,Web Component,Polymer 2.x,Polymer 3.x,我们正在将一个中型应用程序从polymer 1迁移到polymer 3。到目前为止,我们还停留在混合动力部件正常工作的中间阶段 我们在组件初始化定时方面遇到了一些困难。例如: <my-app> <my-component slot='componentslot'><my-component> </my-app> 我有一些可重用的组件,需要知道它们是否在我的复杂组件或其他组件中我的复杂组件使用上下文发现行为,该行为触发一个包含回调作为有效负载的

我们正在将一个中型应用程序从polymer 1迁移到polymer 3。到目前为止,我们还停留在混合动力部件正常工作的中间阶段

我们在组件初始化定时方面遇到了一些困难。例如:

<my-app>
  <my-component slot='componentslot'><my-component>
</my-app>
我有一些可重用的组件,需要知道它们是否在
我的复杂组件
其他组件
中<代码>我的复杂组件使用
上下文发现行为
,该行为触发一个包含回调作为有效负载的事件
my complex component
其他一些组件
具有
上下文行为
s,它们侦听该事件并通过调用回调来响应它

但是由于
我的可重用部件
可能在
我的复杂组件
其他组件
被附加之前就被附加,因此此模式不起作用

在所附的
中注册事件侦听器并触发disosvering事件(即
connectedCallback

例2


在上面的示例中,每个叶和边都需要知道嵌套的深度。同样,每个元素触发一个事件,其父元素将响应该事件。同样,侦听器注册和事件触发在附加的
中完成
/
connectedCallback
。如果在连接内部节点的父节点之前先连接内部节点,mechanik将再次失败


希望这有帮助。

如果您非常希望首先渲染
my app
,您可以使用
dom元素,然后可以让render
my component
执行如下操作:

<my-app ready="{{myAppReady}}>
  <template is='dom-if' if="[[myAppReady]]">
    <my-component slot='componentslot'><my-component>
  </template>
</my-app>
在这一部分中,您可以添加
computed:“检查此值是否与某些值相关,以确保是否依赖于某些值”
,或者您可以添加各种条件以渲染
my component

此外,您还可以动态导入
my component.js
,如下所示:

在我的应用程序的父脚本中:

static get observers(){return ['_checkMyAppReady(myAppReady)']}

_checkMyAppReady(r){
   if(r) import('./my-component.js');
}
编辑

如果有许多元素出现相同的问题,那么最好使用
lazy import.js

_checkMyAppReady(r){
   if(r) import('./lazy-import.js');
}
lazy-import.js

import './my-component.js';
import './my-component2.js';
import './my-component3.js';
...

您可以使用
dom if
元素,如果您非常希望确保首先渲染
my app
,那么您可以让渲染
my component
类似于:

<my-app ready="{{myAppReady}}>
  <template is='dom-if' if="[[myAppReady]]">
    <my-component slot='componentslot'><my-component>
  </template>
</my-app>
在这一部分中,您可以添加
computed:“检查此值是否与某些值相关,以确保是否依赖于某些值”
,或者您可以添加各种条件以渲染
my component

此外,您还可以动态导入
my component.js
,如下所示:

在我的应用程序的父脚本中:

static get observers(){return ['_checkMyAppReady(myAppReady)']}

_checkMyAppReady(r){
   if(r) import('./my-component.js');
}
编辑

如果有许多元素出现相同的问题,那么最好使用
lazy import.js

_checkMyAppReady(r){
   if(r) import('./lazy-import.js');
}
lazy-import.js

import './my-component.js';
import './my-component2.js';
import './my-component3.js';
...

您使用的是onReady方法吗?您使用的是onReady方法吗?如果
,则在
dom中包装几乎所有元素似乎都是一个棘手的解决方法。@samjaf实际上在考虑了一点之后,没有包装每个元素。动态导入。我的意思是,您可以在lazy-import.js文件下导入所有第二级(这里是
my component.js
)。如果你想要一个具体的例子,我会编辑我的答案。谢谢你的更新。使用惰性导入的解决方案确实会更好。遗憾的是,在嵌套相同类型的组件的情况下,这将不起作用。@samjaf确切的问题是什么,因此可能有另一种解决方案,而不是按顺序加载模块。我的意思是,如果你不想激活一个脚本,除非一些数据来自其他元素,那么有一些解决方案。因此,请尝试添加更多您遇到的特殊问题。如果
,则在
dom中包装几乎所有元素似乎是一个棘手的解决方法。@samjaf实际上是在考虑了一点之后,而不是包装每个元素。动态导入。我的意思是,您可以在lazy-import.js文件下导入所有第二级(这里是
my component.js
)。如果你想要一个具体的例子,我会编辑我的答案。谢谢你的更新。使用惰性导入的解决方案确实会更好。遗憾的是,在嵌套相同类型的组件的情况下,这将不起作用。@samjaf确切的问题是什么,因此可能有另一种解决方案,而不是按顺序加载模块。我的意思是,如果你不想激活一个脚本,除非一些数据来自其他元素,那么有一些解决方案。所以,请尝试添加更多您遇到的特殊问题。