如何使对象属性函数成为事件发射器
How to make an object property function into an eventemitter?
这是关于组件之间函数引用的问题的后续。
如果我有ParentComponent
:
export class ParentComponent {
public myParentVariable = 'Hello world';
test() {
console.log(this.myParentVariable);
}
public options: any[] = [
{label: 'Item 1', onClick: this.test},
{label: 'Item 3', onClick: this.test},
{label: 'Item 6', onClick: this.test},
{label: 'Item 2', onClick: this.test}
];
}
如您所见,我在onClick
属性中传递了对test
的引用。
然后我有一个ChildComponent
,我将options
从ParentComponent
:传递到它
<child [options]="options"></child>
在child
中,我有一个列表:
<ul class="dropdown-list">
<li *ngFor="#option of options" (click)="option.onClick()"></li>
</ul>
正如您在模板中所看到的,然后我将之前的onClick
称为(click)="option.onClick()"
。
现在的问题是,从这里开始,它不再知道this.myParentVariable
是什么,因为我们只是传递对test
的引用。因此,我想把onClick
变成EventEmitter
,然后我可以在上面调用.emit()
,这样我们就可以使用正确的数据绑定来执行test
,如图所示。
但是,由于我传递了一个包含对象的数组,该数组包含引用函数的属性,所以我不太确定如何使每个对象的单个onClick
属性成为EventEmitter
。
我试着把整个options
变成一个输出的EventEmitter
,但失败得很惨。
关于如何实现这一点,有什么想法吗?
JavaScript中的这个关键字取决于上下文。在大多数情况下,这个值由函数的调用方式决定。由于TypeScript是JavaScript的类型化超集,它的行为相同,请遵循下面的链接。
ECMAScript 5引入了Function.prototype.bind。调用f.bind(someObject)会创建一个与f具有相同主体和作用域的新函数,但在原始函数中出现这种情况的情况下,在新函数中,无论函数如何使用,它都会永久绑定到bind的第一个参数。
函数的这个关键字,绑定方法
您也可以使用箭头函数作为替代。
通过将父函数传递给子函数,可以将父组件与子组件紧密耦合(通常不建议这样做)。换句话说,您正在向子对象透露有关父方法的信息。理想情况下,孩子不应该了解父母的任何情况。(这使(子)组件更加可重用。)
与您当前的方法不同,即,不将父函数引用传递给子函数,而是传递一些ID或其他一些唯一值。当点击事件发生在子对象中时,将ID或唯一值传递回父对象(使用输出属性/EventEmitter):
<li *ngFor="#option of options" (click)="myEmitter.emit(option.uniqueValue)"></li>
然后在父级中,将该值映射到适当的函数调用并调用它:
<child [options]="options" (myEmitter)="doWork($event)"></child>
doWork(uniqueValue) {
// map uniqueValue to some function and call it
}
这种方法的另一个好处是,您不必处理this
上下文。
- NodeJS-readline暂停和恢复事件发射器(逐行读取)
- Javascript事件发射器一次处理多个事件
- 无法模拟在 node.js 中使用事件发射器刺激的类中的函数
- Node.js+Mocha+Should.js如何测试事件发射器抛出的错误
- 事件发射器模式如何在Node,sockets.io中工作
- 如何使对象属性函数成为事件发射器
- 您应该如何从节点中的事件发射器继承
- 其他模块中的节点事件发射器
- Angular 2 ES6/7事件发射器更新其他组件
- 绑定事件发射器上的单个事件
- 在模块之间共享的事件发射器
- 为什么在传递/公开事件发射器时需要包装我的事件发射器的 on 函数
- 事件发射器与在 AngularJs 中更新大型数据集时的$watch
- 如何在node中编写事件发射器.js让你创建一个函数“myFunction”,然后在运行时调用成功或失败
- 将立即调用的函数表达式 (IIFE) 与事件发射器一起使用
- 在扩展事件发射器的 ES6 类定义中设置事件侦听器
- 警告:可能检测到事件发射器内存泄漏.添加了 11 个 AppUp > 听众.使用 emitter.setMaxListe
- 节点.js事件发射器源代码的说明
- 从事件发射器继承的对象不会引发事件
- process.on('uncaughtException')的令人困惑的事件发射器/闭包模式