- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我是 Angular 4 的新手,我正在使用“动态组件加载”来制作项目,但是存在用于加载组件的 createComponent 问题。
When click on "Event" tab from top header we are hitting event api and showing events in left side bar and then hit event detail api load "2.1 event details" screen. when click on show user then again load "2.2 User Form" dynamic form.
问题:-当点击特定事件的事件详细信息的 api 时,api 现在处于等待状态,然后用户单击“创建事件”选项卡,然后它将创建事件屏幕,然后用户再次单击事件选项卡,然后显示事件详细信息的 createComponent 错误。还单击添加用户按钮,然后再次显示相同的错误。
代码:-
ngAfterViewInit() {
this.getEventList('init');
}
public getEventList(listsource) {
this.appService.getJsonRequest(AppSettings.EVENT_LIST).subscribe(result => {
if (result.status === 200 && result.events) {
this.events = result.events;
this.publicEvents = result.events;
this.events[0].selected = true;
this.selectedEVentInfo = this.events[0];
this.noImgFlag = true;
this.eventDetailFlag = false;
this.eventDetailInfo(listsource);
} else {
this.loaderMsg = AppSettings.EVENT_LIST_ERROR_MSG;
}
// this.loaderFlag = false;
}, err => {
this.loaderMsg = AppSettings.EVENT_LIST_ERROR_MSG;
this.loaderFlag = false;
this.snackBar.open(err, AppSettings.CLOSE, {
duration: AppSettings.DURATION,
});
});
}
eventDetailInfo (event, source: String = null) { // event detail
console.log('### Get event detail information');
if (this.eventDetailFlag === false) {
if ((source === 'list' || source === 'delete' || source === 'stripe') && this.ed !== undefined) { // testing needed
console.log('clear');
this.ed.clear();
}
let edCompFactory: ComponentFactory<any>;
edCompFactory = this.compFactoryResolver.resolveComponentFactory(EdComponent);
const componentRef = this.ed.createComponent(edCompFactory);
(<EdComponent>componentRef.instance).event = this.selectedEVentInfo;
}
}
}
添加用户代码:-
expandAddEventMember(fullWidth) {
if (this.fullWidth === true && fullWidth === true) {
console.log('Before');
if (this.am !== undefined) {
this.am.clear();
}
// setTimeout(() => {
let amCompFactory: ComponentFactory<any>;
amCompFactory = this.compFactoryResolver.resolveComponentFactory(AmComponent);
const componentRef = this.am.createComponent(amCompFactory);
(<AmComponent>componentRef.instance).event = this.selectedEVentInfo;
this.fullWidth = false;
// }, 100);
}
}
这是我的入口组件
entryComponents: [
AppComponent,
ForgotModalComponent,
EventDetailsModalComponent,
AddManagerModalComponent,
AddAdminModalComponent,
CopyLinkModalComponent,
OrderSummaryModalComponent,
EventPreviewModalComponent,
PaidMemberModalComponent,
SendMessageModalComponent,
TicketInfoModalComponent,
AddPaidMemberModalComponent,
MessageModalComponent,
TicketCheckInDetailModalComponent,
SaleItemModalComponent,
SaleItemListModalComponent,
ApmComponent,
PmComponent,
AsmComponent,
SlmComponent,
TiComponent,
EdComponent,
AmComponent,
SihComponent,
ImageModalComponent,
GoogleMapModalComponent
]
最佳答案
你只需要确保 am
和 em
在创建组件之前被实例化。我假设它们可以是未定义的,因为在你的代码中,你已经检查如果 am
或 em
在某个阶段被实例化 if(this.am !== undefined)
(在调用 clear
之前) >),但不是为了调用 createComponent
。只是你需要在 if
createComponent
代码
eventDetailInfo(event, source: String = null)
{ // event detail
console.log('### Get event detail information');
if (this.eventDetailFlag === false)
{
if ((source === 'list' || source === 'delete' || source === 'stripe') && this.ed !== undefined)
{ // testing needed
console.log('clear');
this.ed.clear();
/*} <======= Remove this bracket*/
let edCompFactory: ComponentFactory<any>;
edCompFactory = this.compFactoryResolver.resolveComponentFactory(EdComponent);
const componentRef = this.ed.createComponent(edCompFactory);
(<EdComponent>componentRef.instance).event = this.selectedEVentInfo;
}/* <========== Add it here */
}
}
同样适用于addUser
expandAddEventMember(fullWidth)
{
if (this.fullWidth === true && fullWidth === true)
{
console.log('Before');
if (this.am !== undefined)
{
this.am.clear();
/* } <=== Remove this bracket **/
let amCompFactory: ComponentFactory<any>;
amCompFactory = this.compFactoryResolver.resolveComponentFactory(AmComponent);
const componentRef = this.am.createComponent(amCompFactory);
(<AmComponent>componentRef.instance).event = this.selectedEVentInfo;
this.fullWidth = false;
} /** <==== Add it here */
}
}
编辑:关于您关于规范化的评论,您可能应该提出另一个问题,因为这是一个完全不同的问题。以下一段代码可能不起作用(未经测试),但可以让您了解一种方法
@Injectable()
export class CompFactoryHelper
{
constructor(private resolver: ComponentFactoryResolver)
{
}
public createAndAddComponent(containerRef: ViewContainerRef, eventInfo : any, type: any)
{
containerRef.clear();
let compFactory = this.resolver.resolveComponentFactory(type);
const componentRef = containerRef.createComponent(compFactory);
(componentRef.instance as any).event = eventInfo;
}
}
在你的组件中
expandAddEventMember(fullWidth)
{
if (this.fullWidth === true && fullWidth === true)
{
console.log('Before');
if (this.am !== undefined)
{
this.compFactoryHelper.createAndAddComponent(this.am, this.selectedEVentInfo, AmComponent);
}
}
}
关于angular - 错误类型错误 : Cannot read property 'createComponent' of undefined in angular 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49197557/
问题 - 我将 ViewContainerRef 传递到我的构造函数中以实例化名为“MemberCardComponent”的组件。然后我尝试用输入数据填充它,但没有数据被填充到 innerHTML
我正在通过 createComponent 创建一个动态组件方法,但我在获取 child 时遇到问题组件更新它的 input从 parent 传入的值来自 component.instance.pro
我正在尝试通过单击按钮动态加载微调器组件。 Plunker 链接在这里, http://plnkr.co/edit/UEEQQRzX7RIkSO49rCHu?p=preview let element
我使用 viewContainerRef.createComponent 将动态组件加载到根组件中(......),但实际上它附加了错误的位置, 我的代码: -----app.compoment.ts
这更像是一个概念性问题。 我必须处理必须创建动态 h:dataTable 的功能.每当我创建一个组件时,我都会做类似的事情: DataTable table = (DataTable) FacesCo
我有自己的分析器和方法 protected TokenStreamComponents createComponents(final String fieldName, final Reader re
我在运行代码来创建简单的调查时遇到问题。我刚刚开始使用 UI,BoxLayout 给了我一个错误:线程“AWT-EventQueue-0”中的异常 java.awt.AWTError:BoxLayou
我在自定义分析器实现的 createComponents 实现中使用了 HTMLStripCharFilter,但 HTML 并未从内容中剥离。请在下面找到代码。 @Override prot
我有一个案例,我在列表中动态创建组件(经常刷新)并像这样使用 ngSwitch: 我想知道是否有更好更有效的方法,或者这是正
我正在尝试使用@ViewChild 将组件动态注入(inject)到父位置,但出现错误: Cannot read property 'createComponent' of undefined 在我尝
我对 createEmbeddedView 和 createComponent 的用例感到困惑,即何时使用哪个。 请提出一些可以说明在“动态创建场景”中使用其中任何一个的合适设置的案例。 最佳答案 请
当用户单击如下所示的按钮时,我正在尝试将动态组件加载到我的 View 中: Show Panel 但是,当单击我 View 中的按钮时,我尝试运行 loadComponent()但我收
我在我的 Angular 应用程序上实现了一个登录系统。我发现了一个好资源here为了那个原因。但是自定义 RouterOutlet 指令中有一个错误,如下所示: import { ElementRe
我是 Angular 4 的新手,我正在使用“动态组件加载”来制作项目,但是存在用于加载组件的 createComponent 问题。 上图中有四个部分。 顶部部分(headerComponent)
我做了一个弹出窗口。 Window window = (Window)Executions.createComponents("./org.zul", null, **map**); ./org.zu
我正在尝试在 angular4 中动态添加组件。我检查了其他问题,但我找不到解决方案。我得到了错误 ERROR TypeError: Cannot read property 'createCompo
当使用 karma 和 browserify 运行简单测试时,我的测试在 TestBed.createComponent() 函数内崩溃。 这是崩溃的 beforeEach: import { Com
我是一名优秀的程序员,十分优秀!