2

我有一个应用程序,其中 app.component 只有路由器插座。ng-template在从应用程序组件向下 4 级的组件中添加 ViewChild 之前,我没有任何问题。这是结构:

AppComponent 使用 FolderComponent 延迟加载 FolderModule。文件夹组件模板是呈现子组件的 ngFor。它是具有 ViewChild 的子组件。我不确定解释这一点的好方法。我认为错误中的 ngIf 是我的 ng-if,一旦有数据就会加载页面。我希望有人能认识到这个错误并告诉我它的含义以及为什么这么深的东西会导致应用程序的根本问题。ngIf 部分继续进行:

这是导致它的行。错误如下:

@ViewChild('performercontainer', {read: ViewContainerRef}) performerContainer: ViewContainerRef;

尝试在对象'function ViewContainerRef(){}'上使用描述符'{“value”:“RouterOutlet”,“configurable”:true}'配置'__source'并出错,放弃:TypeError:无法定义属性__source,object is not extensible zone.js:2257 Attempting to configure '__source' with descriptor '{"value":"NgIf","configurable":true}' on object 'function ViewContainerRef() { }' 并得到错误,放弃: TypeError:无法定义属性__source,对象不可扩展

4

3 回答 3

4

对于遇到此问题的任何人。问题是我正在使用来自ngrx的storeFreeze。我删除了它,错误就消失了。所以我想这有点咄咄逼人。

于 2018-07-21T13:23:06.677 回答
2

要扩展@tubbsy 的答案,您可以选择使用MinimalRouterStateSerializer,这是来自@ngrx/router-store docs的引用:

RouterState.Minimal 将使用 MinimalRouterStateSerializer 序列化程序来序列化 Angular 路由器的 RouterState 和 RouterEvent。

MinimalRouterStateSerializer 和默认的RouterStateSerializer 的区别在于这个序列化器是完全可序列化的。为了使状态和动作可序列化,参数 paramMap、queryParamMap 和 component 被忽略。

StoreRouterConnectingModule.forRoot({
  routerState: RouterState.Minimal,
});

发生错误是因为默认RouterStateSerializer包含组件类作为存储操作的属性,因此如果启用严格的运行时不变性检查,组件类将递归冻结,这会干扰 Angular DI(这一行)。这也可能导致 Ivy 出现问题

于 2019-10-11T10:26:25.277 回答
2

对于那些不信任自己的人,或者更有可能是不称职的同事,在没有 Store Freeze 的情况下不可变地编码:您可以通过实现自定义状态“序列化器”来解决这个难题,如 Ngrx 文档中所示。

于 2018-10-22T14:40:09.443 回答