【发布时间】:2020-06-16 04:34:07
【问题描述】:
我正在构建一些WebComponent,我将在不同的库/框架中使用它们,但主要是普通的JavaScript。我正在考虑为此使用Angular Elements,并在几个文档之后构建了一个示例。
它运行良好,内置了所有自然的 Angular 好东西。但是,我正在努力解决的是,从普通的 JavaScript 中读取 Web 组件中的数据,类似于 var result = myComponent.value .
- 请注意,我正在读取的此数据不是原始数据,也不是单个值。它就像一个包含许多细节的对象,来自一个复杂的
WebComponent - 我想要
readonly property之类的东西 - 组件的标准
Angular文档始终为此使用@Output()和EventEmitter。但由于我将在Angular世界之外将组件用作WebComponent,因此我不能(也不想)使用这种方法。另外,我不想通知值的每次更改,而只是在需要时读取值
如果我用普通的JavaScript 编写标准的WebComponent,我可以这样做
class MyComponent extends HTMLElement {
constructor() {
super();
this.name = 'Guest';
this.count = 0;
}
// more code...
// THIS result PROPERTY IS USED TO READ DATA FROM THE WEB COMPONENT
get result() {
return { name: this.name, count: this.count }; // <<== to read data
}
connectedCallback() {
this.attachShadow({ mode: 'open' });
this.shadowRoot.innerHTML = `
<style>
styles....
</style>
<h1>MyComponent</h1>
More HTML...
`;
}
}
customElements.define('my-component', MyComponent);
// Then I can use <my-component></my-component> in my application HTML
// And in the JavaScript code, I can read data from my-component as
const result = document.querySelector('my-component').result;
// which would be something like { name: 'Guest', count: 0 }
有没有办法在AngularElements 中做到这一点?
【问题讨论】:
-
可以用纯JS
Object.defineProperty吗? -
@Danny'365CSI'Engelman 你能解释一下
Object.defineProperty()在这个场景中的帮助吗? -
从您的 NG 代码中定义一个只有 getter 返回对象的属性,然后行为与上面的 vanilla 代码中的
resultgetter 完全相同。
标签: javascript angular web-component angular9 angular-elements