Warm tip: This article is reproduced from serverfault.com, please click

javascript-在Aurelia中,我可以从包含的视图模型中绑定一个要由自定义元素调用的函数吗?

(javascript - In Aurelia, can I bind a function from my containing view-model to be called by my custom element?)

发布于 2016-08-20 14:46:42

我有一个自定义元素,它将接受用户输入,然后单击[保存]按钮,我想将信息传递给父视图模型,以便可以将其发送到服务器并移至下一部分。例如,我将简化此操作:

my-element.js

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

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

my-element.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>

有关演示,请参阅(app.js和app.html代表parent-view-model.js和parent-view-model.html):

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

有用!有点儿。不幸的是,this似乎绑定到my-element而不是parent-view-model,因此在此示例中,打印到控制台的内容是:parent property: undefined这是行不通的。

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

Questioner
Anj
Viewed
1
3,596 2017-07-07 20:36:06

你有两个选择。你可以使用“自定义事件”来处理此问题,也可以使用callAnj在其答案中提到绑定来进行处理。你使用哪一个取决于你的实际用例。

如果希望自定义元素能够在父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;
  }
}

my-element.html:

<template>
    <input type="text" value.bind="eventDetailValue" />
    <button click.delegate="save()">Click this</button>
</template>

my-element.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)。

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