如何在子组件控制器类中捕获@input参数

Posted

技术标签:

【中文标题】如何在子组件控制器类中捕获@input参数【英文标题】:how to capture the @input parameter in the child component controller class 【发布时间】:2017-04-26 19:52:42 【问题描述】:

如何在子组件控制器类中捕获@Input() 参数。我试图从 Constructor 和 OnInit 生命周期事件中控制台记录它,但它是未定义的。但是 id 通过一种方式绑定正确显示在子组件 html

我需要参数信息来在我的子组件中编写一些自定义逻辑。

parent.component.ts

@Component(
  selector: 'app-parent',
  templateUrl: './parent.component.html'
)
export class ParentComponent implements OnInit 
    parameter : any = [1 ,2, 3] ; 

child.component.ts

@Component(
  selector: 'app-child',
  templateUrl: './child.component.html'
)
export class ChildComponent implements OnInit 
    @Input() parameter : any ; 
    Constructor() 
        console.log(this.parameter) // prints undefined
    
    ngOnInit() 
        console.log(this.parameter) // prints undefined
    

parent.component.html

<app-child [parameter]='parameter' ></app-child>

child.component.html

 parameter  // prints [1 ,2, 3]

【问题讨论】:

添加一些示例代码 【参考方案1】:

如果您在代码的这个 plunker 中看到,您会看到只有 constructor 输出未定义,ngOnInit 输出数组 [1, 2, 3]

这是一个工作的 plunker https://embed.plnkr.co/szRxO7b94r1o15vLbLbl/

更新评论 plunker 现在使用服务和测试 API,它在父子节点上运行良好。使用 ngOnChanges,因此您可以在响应返回后对其进行处理。您应该阅读@Günter Zöchbauer 在他的回答中提到的lifecycle hooks。

【讨论】:

感谢 plunkr 工作示例。我尝试设置相同的变量,它在我的项目中也能完美运行,我很惊讶,然后我意识到我在父组件的订阅事件中设置了变量,这些变量是未定义的(因为它仍然没有被分配为ngOnInit 在子组件上运行?)this.service.getMethod().subscribe(results =&gt; this.parameter = results ); @Sal 我已经使用连接到测试 API 的服务更新了 plunker。如果您也可以分享您的服务或尝试制作一个显示您的问题的插件。 @j plunkr 也有同样的问题....我也能够将它绑定到 UI,但无法在 ngOnInit 事件中捕获它以处理对象。下面是从 ngOnInit 方法清楚地打印 undefined 的控制台数据。 run.plnkr.co/preview/ciwmjiw2a00093j5nmmxxuks9/src/app.ts!transpiled:52 constructor undefined run.plnkr.co/preview/ciwmjiw2a00093j5nmmxxuks9/src/app.ts!transpiled:55 ngOnInit undefined @Sal 那是因为对服务的请求没有返回请求。该请求的时间完全取决于从具有许多不同因素的 api 中检索该数据。当请求成功返回以使用数据时,您将需要订阅等待更改或触发事件。您到底想对孩子返回的数据做什么? @sal 如果您查看更新后的 plunker,您会发现 ngOnChanges 可以满足您的要求。【参考方案2】:

正如人们之前所说,您应该在 ngOnInit() 中获取参数值

还有两个细节:你不需要使用'implements OnInit',并在开头使用小'c'字母写'constructor()'。

【讨论】:

【参考方案3】:

@Input()s 在构造函数执行时尚未设置。

当更改检测运行并更新时,@Input()s ngOnChanges() 被调用。

第一次调用ngOnChanges() 后,调用ngOnInit()

有关生命周期方法的更多详细信息,请参阅https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html

【讨论】:

以上是关于如何在子组件控制器类中捕获@input参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在子窗口小部件下使用 eventfilter 来捕获自定义事件

子组件如何在子组件初始化时控制父组件中自身的可见性?

如何修复“未捕获的错误:查询不再有模拟响应”

如何在 Input Angular Decorator 中使用 Observable?

Angular:如何订阅 @Input 更改

angular2 在子组件中更改@input 值,然后在父组件中更改此值不起作用