【问题标题】:Angular Elements Events not firing e.g. ngOnInitAngular Elements 事件未触发,例如ngOnInit
【发布时间】:2020-03-12 08:20:43
【问题描述】:

我认为这是我做错了,但我不知道是什么。我想在我的 Angular Web 组件中进行路由,我可以让路由工作。但是,如果我使用解析器,路由插座中使用的组件将无法正常工作。事件没有触发!

或者至少...如果您从应用程序中的另一条路线导航到此路线,它们会触发,例如,从 myWebsite.com/#/ 转到 myWebsite.com/#/myRoute/myParameter 工作正常,解析器获取数据并按预期触发所有事件。但是,如果我在此路由上按刷新或尝试将 URL (myWebsite.com/#/myRoute/myParameter) 直接粘贴到组件呈现的新选项卡/浏览器中,则调用构造函数,但不会触发任何事件!

仅当我添加解析器时才会发生这种情况。如果我删除解析器并在每个生命周期事件中添加一个 console.log,它们每次都可以工作!有什么我可以配置不同的吗?这是一个错误吗?

或者有没有一种方法可以让我从 API 获取数据,强制事件等待,从而绕过对解析器的需求。我需要在组件尝试呈现之前的数据,因为表单是动态的 - 所有表单问题都来自该 API 调用。我已经尝试通过订阅它来调用 ngOninit 和构造函数中的服务方法,但是它会在所有事件触发后获取数据并且我只有一个空白表单。

谢谢!

【问题讨论】:

  • 您能告诉我您在哪里使用解析器 AppComponent 或服务吗?如果您在服务中使用解析器,最好这样做,并且您必须在路由器中添加 resolver:{cres: yourResolverSrvice}
  • 如果我做对了,您的要求是每当您的 API 响应返回时构建表单?
  • 不幸的是,它似乎不仅仅是解析器。似乎变化检测在角度元素中无法正常工作。 github.com/angular/angular/issues/24181
  • @Abhishek 解析器是一个标准的可注入解析器,然后我在路由器中添加了 ,resolver {data: myResolver} 正如你所说的。相反,我决定只订阅 ngOnInit 中的 oberable。这有效,但如果您刷新页面,它就不起作用。出于某种原因,如果您这样做,更改检测会中断

标签: angular element resolver


【解决方案1】:

原来这是 zone.js 中的一个错误。更改检测无法按预期工作。有一个修复程序,但尚未发布。与此同时,其他人已经对这个 npm 包进行了非官方修复......

elements-zone-strategy

它就像一个魅力!

把这个放到你的 app.module.ts 中

import { ElementZoneStrategyFactory } from 'elements-zone-strategy';

const strategyFactory = new ElementZoneStrategyFactory(HelloComponent, this.injector);
const helloElement = createCustomElement(HelloComponent, { injector: this.injector, strategyFactory });
customElements.define('my-hello', helloElement);

【讨论】:

  • 原来这也解决了解析器问题。这完全与变更检测有关!
  • 这不适用于 angular 10.1.3、elements-zone-strategy 10.0.0(和 zone.js 0.11.3)。仍在寻找解决办法。
  • @PhilThomas 你能找到解决办法吗?我有和你一样的版本,还没有运气
猜你喜欢
  • 2016-12-06
  • 2019-04-16
  • 2018-04-25
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 2017-11-07
相关资源
最近更新 更多