为此,您有两种选择。您可以使用自定义事件来处理此问题,也可以使用call
Anj 在他的回答中提到的绑定。您使用哪一种取决于您的实际用例。
如果您希望自定义元素能够调用父虚拟机上的方法并传递数据out的自定义元素,那么您应该使用自定义事件,如下要点所示:https://gist.run/?id=ec8b3b11f4aa4232455605e2ce62872c https://gist.run/?id=ec8b3b11f4aa4232455605e2ce62872c:
应用程序.html:
<template>
<require from="./my-element"></require>
<div class="content-panel">
<my-element save.delegate="parentMethod($event)"></my-element>
</div>
parentProperty = '${parentProperty}'
</template>
app.js:
export class App {
parentProperty = 7;
parentMethod($event) {
this.parentProperty = $event.detail;
}
}
我的元素.html:
<template>
<input type="text" value.bind="eventDetailValue" />
<button click.delegate="save()">Click this</button>
</template>
我的元素.js:
import { inject, customElement, bindable } from 'aurelia-framework';
@customElement('my-element')
@inject(Element)
export class MyElement {
eventDetailValue = 'Hello';
constructor(element) {
this.element = element;
}
save() {
var event = new CustomEvent('save', {
detail: this.eventDetailValue,
bubbles: true
});
this.element.dispatchEvent(event);
}
}
您基本上会附加需要传递的任何数据detail
自定义事件的属性。在事件绑定声明中,您将添加$event
作为函数的参数,然后检查detail
事件处理程序中 $event 的属性(您也可以只传递$event.detail
如果你愿意的话)。
如果您希望自定义元素能够调用父虚拟机上的方法并从父虚拟机(或从另一个自定义元素或其他元素)传入数据,那么您应该使用call
捆绑。您可以通过在绑定声明中指定参数来指定将传递给方法的参数(foo.call="myMethod(myProperty)"
。这些参数来自声明绑定的 VM 上下文,而不是来自自定义元素的 VM。