首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模板:通过DOM从另一个组件调用公共方法

模板:通过DOM从另一个组件调用公共方法
EN

Stack Overflow用户
提问于 2021-03-30 07:01:27
回答 1查看 313关注 0票数 0

我有一个带有refresh()方法的模板侧边栏组件。我已经用@Method()暴露了它

代码语言:javascript
复制
@Method() async refresh() { ... }

我可以在我的应用程序中调用它:

代码语言:javascript
复制
const sidebar = document.querySelector('my-sidebar');
await sidebar.refresh();

然而,我也有一个弹出式组件,它是由应用程序通过一个单独的应用程序接口生成的,我想使弹出式组件中的一个按钮触发侧边栏的refresh()。我已经在弹出窗口中将该方法设置为Prop

代码语言:javascript
复制
@Prop() refresh: Function;

并且我已经在应用程序代码中将Prop设置为对该方法的引用:

代码语言:javascript
复制
popup.refresh = sidebar.refresh;

...but当我尝试执行它时,我得到一个错误:

Uncaught (in promise) TypeError: ref.$lazyInstance$[memberName] is not a function

怎样才能让弹出窗口看到侧边栏的方法呢?

EN

回答 1

Stack Overflow用户

发布于 2021-03-30 07:01:27

如果您在尝试分配该属性时查看应用程序中sidebar.refresh的值,您将看到如下所示:

代码语言:javascript
复制
value(...args) {
  const ref = getHostRef(this);
  return ref.$onInstancePromise$.then(() => ref.$lazyInstance$[memberName](...args));
}

模板组件是通过生成带有指向方法的引用的代理来延迟加载的,因此您只是将一个引用传递给代理。解决这个问题的最简单的方法是创建一个显式调用该方法的函数,强制其水合。(如果源组件还没有水合,您需要首先使用它的生命周期方法等待。)

这是你的应用程序中的样子:

代码语言:javascript
复制
popup.refresh = () => sidebar.refresh();

// or, passing any arguments:
popup.refresh = args => sidebar.refresh(args);

您也可以在popup组件中执行此操作:

代码语言:javascript
复制
async popupRefresh() {
  let sidebar = document.querySelector('my-sidebar');
  await sidebar.refresh();
}

如果以这种方式从另一个组件内部调用该方法,您可能会看到TypeScript错误Property 'refresh' does not exist on type 'Element'.

要避免这种情况,请将侧边栏组件导入到popup组件中:

代码语言:javascript
复制
import { mySidebar } from 'stencil';

然后,使用它作为类型:

代码语言:javascript
复制
let sidebar: mySidebar = document.querySelector('my-sidebar');
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66862716

复制
相关文章

相似问题

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