gpt4 book ai didi

javascript - 在 Aurelia 中,我可以从我的包含 View 模型中绑定(bind)一个函数以供我的自定义元素调用吗?

转载 作者:可可西里 更新时间:2023-11-01 02:52:12 25 4
gpt4 key购买 nike

我有一个将接受用户输入的自定义元素,在单击 [save] 按钮时,我想将信息传递给父 View 模型,以便我可以将其发送到服务器并转到下一部分。为了示例的缘故,我将对此进行简化:

my-element.js:

import { customElement, bindable } from 'aurelia-framework';

@customElement('my-element')
@bindable('save')
export class MyElement { }

我的元素.html:

<template>
<button click.delegate="save()">Click this</button>
</template>

parent-view-model.js:

export class ParentViewModel {
parentProperty = 7;
parentMethod() {
console.log(`parent property: ${this.parentProperty}`);
}
}

parent-view-model.html:

<template>
<require from="./my-element"></require>
<div class="content-panel">
<my-element save.bind="parentMethod"></my-element>
</div>
</template>

demo见(app.js和app.html代表parent-view-model.js和parent-view-model.html):

https://gist.run/?id=96b203e9ca03b62dfb202626c2202989

有效!有点儿。不幸的是,this 似乎绑定(bind)到 my-element 而不是 parent-view-model,所以在这个例子中,打印到控制台的内容是:父属性:未定义。那是行不通的。

我知道我可以利用 EventAggregator 来促进自定义元素和 View 模型之间的某些通信,但如果我可以帮助它,我想避免增加复杂性。

最佳答案

您有两种选择。您可以使用自定义事件来处理此问题,也可以使用 Anj 在他的回答中提到的 call 绑定(bind)来完成。您使用哪一个取决于您的实际用例。

如果您希望自定义元素能够调用父 VM 上的方法并将数据传出 自定义元素,那么您应该使用自定义事件,如本要点所示:https://gist.run/?id=ec8b3b11f4aa4232455605e2ce62872c :

app.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 属性上。在事件绑定(bind)声明中,您将添加 $event 作为函数的参数,然后检查事件处理程序中 $event 的 detail 属性(您也可以只传递$event.detail 如果你愿意的话)。

如果您希望自定义元素能够调用父 VM 上的方法并从父 VM(或从另一个自定义元素或其他东西)传入数据,那么您应该使用 call绑定(bind)。您可以通过在绑定(bind)声明 (foo.call="myMethod(myProperty)") 中指定参数来指定将传递给方法的参数。这些参数来自声明绑定(bind)的 VM 上下文,而不是来自自定义元素的虚拟机)。

关于javascript - 在 Aurelia 中,我可以从我的包含 View 模型中绑定(bind)一个函数以供我的自定义元素调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39055388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com