在 Angular @Input() 不适用于最简单的硬编码字符串输入
In Angular @Input() doesn't work for the simplest hardcoded string input
我有 admin.users.list.html 作为父模板,它向子组件输入一些数据:
<general-entities-list-container *ngIf="{
entityType: entityType$ | async
} as asyncData"
[entityType]='asyncData.entityType'
[entityTypeHardCoded]="'users'"
[entityTypeSet]="'users'"
>
</general-entities-list-container>
我有 general-entity-list-container.html(子模板):
entityType is:{{ entityType }} <br/>
entityTypeSet is:{{ entityTypeSet }} <br/>
entityTypeSet_ is:{{ entityTypeSet_ }} <br/>
entityTypeHardCoded is:{{ entityTypeHardCoded }} <br/>
admin.users.list.ts:
entityType$: Observable<string> = of('users');
general-entity-list-container.ts 有:
@Input() entityType: string;
@Input() entityTypeHardCoded: string;
entityTypeSet_: string;
@Input() set entityTypeSet(cet: string) {
this.entityTypeSet_ = cet;
//this.handleChangeCurrentEntityType(cet);
}
get entityTypeSet(){
return this.entityTypeSet_;
}
我无法在子组件模板中的任何位置绝对输出。这里有什么问题。我在父组件和子组件上都使用 changeDetection: ChangeDetectionStrategy.OnPush,
。
首先,您的 *ngIf 将始终 return 为真(它会检查是否定义了 asyncData 对象,但实际上是您在定义它,所以这将是真的)。如果您尝试将异步管道订阅组合在一起,那么最好在顶部包装器元素中使用 *ngIf,然后在您的子元素中使用
*ngIf="asyncData.entityType"
类似于:
<div *ngIf="{
entityType: entityType$ | async
} as asyncData"
<child-component
*ngIf="asyncData.entityType"
[entityType]="asyncData.entityType">
</child-component>
</div>
然后我看到单引号,应该是双引号:
[entityType]='asyncData.entityType'
应该是:
[entityType]="asyncData.entityType"
除此之外,它适用于 stackblitz。所以肯定还有其他问题。将组件导入模块、将模块导入模块、在组件中引用错误的模板等。但似乎 Angular 输入仍然有效 :)
我建议您先尝试使用 stackblitz,然后检查 components/modules 设置中还有什么问题。问题就在那里,不在输入中。
https://stackblitz.com/edit/angular-ivy-zgqtey?file=src%2Fapp%2Fapp.component.html[][1]
我有 admin.users.list.html 作为父模板,它向子组件输入一些数据:
<general-entities-list-container *ngIf="{
entityType: entityType$ | async
} as asyncData"
[entityType]='asyncData.entityType'
[entityTypeHardCoded]="'users'"
[entityTypeSet]="'users'"
>
</general-entities-list-container>
我有 general-entity-list-container.html(子模板):
entityType is:{{ entityType }} <br/>
entityTypeSet is:{{ entityTypeSet }} <br/>
entityTypeSet_ is:{{ entityTypeSet_ }} <br/>
entityTypeHardCoded is:{{ entityTypeHardCoded }} <br/>
admin.users.list.ts:
entityType$: Observable<string> = of('users');
general-entity-list-container.ts 有:
@Input() entityType: string;
@Input() entityTypeHardCoded: string;
entityTypeSet_: string;
@Input() set entityTypeSet(cet: string) {
this.entityTypeSet_ = cet;
//this.handleChangeCurrentEntityType(cet);
}
get entityTypeSet(){
return this.entityTypeSet_;
}
我无法在子组件模板中的任何位置绝对输出。这里有什么问题。我在父组件和子组件上都使用 changeDetection: ChangeDetectionStrategy.OnPush,
。
首先,您的 *ngIf 将始终 return 为真(它会检查是否定义了 asyncData 对象,但实际上是您在定义它,所以这将是真的)。如果您尝试将异步管道订阅组合在一起,那么最好在顶部包装器元素中使用 *ngIf,然后在您的子元素中使用
*ngIf="asyncData.entityType"
类似于:
<div *ngIf="{
entityType: entityType$ | async
} as asyncData"
<child-component
*ngIf="asyncData.entityType"
[entityType]="asyncData.entityType">
</child-component>
</div>
然后我看到单引号,应该是双引号:
[entityType]='asyncData.entityType'
应该是:
[entityType]="asyncData.entityType"
除此之外,它适用于 stackblitz。所以肯定还有其他问题。将组件导入模块、将模块导入模块、在组件中引用错误的模板等。但似乎 Angular 输入仍然有效 :)
我建议您先尝试使用 stackblitz,然后检查 components/modules 设置中还有什么问题。问题就在那里,不在输入中。
https://stackblitz.com/edit/angular-ivy-zgqtey?file=src%2Fapp%2Fapp.component.html[][1]