在 Aurelia 中将操作传递给具有父级上下文的组件
Pass action to a component with the parent's context in Aurelia
如何将一个动作从父组件 view/component 传递到子组件并仍然保持父组件的上下文。下面的 plunkr 中显示的问题表明,如果操作是在组件中执行的,那么它是在组件的上下文中,而不是传递操作的父级。基本上是典型的 "that = this" 问题。
是的,您可以使用 eventAggregator 来执行此操作,但如果没有它您将如何操作。是否必须将整个 viewModel 传递到组件中?
http://plnkr.co/edit/n1xPUdR5nhXwwIivawBj?p=preview
// app.js
import { inject } from 'aurelia-framework';
import { MyService } from './my-service';
@inject(MyService)
export class App {
constructor(myService) {
this.myService = myService;
this.message = "Hello World!";
}
doThing() {
console.log('do a thing');
this.myService.foo();
}
}
<!--app.html-->
<template>
<require from="./my-component"></require>
<p>${message}</p>
<button click.delegate="doThing()">Do the thing - in app.html</button>
<my-component do.bind="doThing"></my-component>
</template>
// my-component.js
import { bindable } from 'aurelia-framework';
@bindable('do')
export class MyComponentCustomElement {
}
<!-- my-component.html -->
<template>
<button click.delegate="do()">Do the thing - in my-component</button>
</template>
// my-service.js
export class MyService {
foo() {
alert("pity da foo");
}
}
如果您真的想这样做(可能有更简洁的方法),您需要从子视图模型访问父视图模型,然后在调用方法时您的子视图的点击绑定,在调用时使用 .call()
更改 do()
方法的 scope/context。
因此,在您的子视图模型中,首先通过添加以下 bind
方法来访问您父视图模型:
bind( bindingContext ) {
// bindingContext is your parent view-model
this.parent = bindingContext;
}
访问父视图模型后,您可以将子视图中的点击绑定更新为如下:
<button click.delegate="do.call( parent )">Do the thing - in my-component</button>
这将从父视图模型的上下文中调用 do()
方法。
您可以使用 .call( scope/context, list, of, args, ... )
或 .apply( scope/context, [array of args])
。有关 .call()
方法的更多信息,请查看 Mozilla's explanation
如何将一个动作从父组件 view/component 传递到子组件并仍然保持父组件的上下文。下面的 plunkr 中显示的问题表明,如果操作是在组件中执行的,那么它是在组件的上下文中,而不是传递操作的父级。基本上是典型的 "that = this" 问题。
是的,您可以使用 eventAggregator 来执行此操作,但如果没有它您将如何操作。是否必须将整个 viewModel 传递到组件中?
http://plnkr.co/edit/n1xPUdR5nhXwwIivawBj?p=preview
// app.js
import { inject } from 'aurelia-framework';
import { MyService } from './my-service';
@inject(MyService)
export class App {
constructor(myService) {
this.myService = myService;
this.message = "Hello World!";
}
doThing() {
console.log('do a thing');
this.myService.foo();
}
}
<!--app.html-->
<template>
<require from="./my-component"></require>
<p>${message}</p>
<button click.delegate="doThing()">Do the thing - in app.html</button>
<my-component do.bind="doThing"></my-component>
</template>
// my-component.js
import { bindable } from 'aurelia-framework';
@bindable('do')
export class MyComponentCustomElement {
}
<!-- my-component.html -->
<template>
<button click.delegate="do()">Do the thing - in my-component</button>
</template>
// my-service.js
export class MyService {
foo() {
alert("pity da foo");
}
}
如果您真的想这样做(可能有更简洁的方法),您需要从子视图模型访问父视图模型,然后在调用方法时您的子视图的点击绑定,在调用时使用 .call()
更改 do()
方法的 scope/context。
因此,在您的子视图模型中,首先通过添加以下 bind
方法来访问您父视图模型:
bind( bindingContext ) {
// bindingContext is your parent view-model
this.parent = bindingContext;
}
访问父视图模型后,您可以将子视图中的点击绑定更新为如下:
<button click.delegate="do.call( parent )">Do the thing - in my-component</button>
这将从父视图模型的上下文中调用 do()
方法。
您可以使用 .call( scope/context, list, of, args, ... )
或 .apply( scope/context, [array of args])
。有关 .call()
方法的更多信息,请查看 Mozilla's explanation