首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从父方法角度8调用子分量方法

从父方法角度8调用子分量方法
EN

Stack Overflow用户
提问于 2020-06-30 14:26:49
回答 2查看 406关注 0票数 0

我需要从父组件调用子组件方法,并需要发送对象。下面的代码给出了以下错误:无法读取未定义的属性“RunMe”

我错过了什么?

儿童部分:

代码语言:javascript
复制
runMe = (item)  => {
    this.cdr.detectChanges();
    if (item.hidden) {
        this.showErrorMsgEvent.emit();
    } else {
        this.highLightEvent.emit(item);
    }
}

父级:

代码语言:javascript
复制
@ViewChild(childComponent, { static: true }) childComponent;

ListenIframeEvents(){
    window.addEventListener("message", this.displayMessage, false)
  }
  displayMessage (item) {
    this.childComponent.RunMe(item)
  }


<child-component #childComponent></child-component>

我在谷歌上搜索过,大多数答案都建议添加#选择器,但这对我不起作用。

FYI:如果我在this.childComponent.RunMe()下运行这个函数,它就能工作。所以我不明白我做错了什么

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-30 14:33:56

问题是在线window.addEventListener("message", this.displayMessage, false)

将其更改为window.addEventListener("message", this.displayMessage.bind(this), false)

更新:

当将方法作为参数传递给函数时,它将失去它的上下文(this)。为了强制它的上下文使用我们的上下文,我们使用.bind()使其上下文(this)显式化。

有关更多信息,请访问https://www.javascripttutorial.net/javascript-this/

票数 1
EN

Stack Overflow用户

发布于 2020-06-30 14:31:52

这里有两个可能的问题。

第一个是:子组件位于一些结构指令下,比如*ngIf。在这里,将子标记为{static: false}应该可以解决问题。

另一种情况是,您使用"displayMessage“方法太早,而您的父级模板尚未呈现。如果是这样,将this.displayMessage(...)调用放在ngAfterViewInit角度生命周期钩子中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62659749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档