【发布时间】:2016-01-18 16:15:56
【问题描述】:
我有 3 个组件来管理树:面板、树和节点。
面板包含一棵树
@Component({
selector: 'panel',
template: `
<input type="button" (click)="createNode()" value="new node">
<input type="button" (click)="createChild()" value="new child">
<input type="button" (click)="deleteNode()" value="delete node">
<tree [tree]="myTree"></tree>
Selected node: {{selectedNode | json}}
`,
directives: [Tree]
})
export class Panel {
public selectedNode;
constructor() {}
}
树包含一个或多个节点(根节点)
@Component({
selector: 'tree',
template: `<node *ngFor="#n of tree" [node]="n"></node>`,
directives: [Node]
})
export class Tree {
@Input() tree;
constructor() {}
}
一个节点又可以包含一个或多个节点(子节点)
@Component({
selector: 'node',
providers: [],
template: `
<p (click)="onSelect(node)">{{node.name}}</p>
<div class="subTree">
<node *ngFor="#n of node.children" [node]="n"></node>
</div>
`,
directives: [Node]
})
export class Node {
@Input() node;
constructor() {}
onSelect(node) {
console.log("Selected node: " + node.name);
}
}
Panel 是一个组件,它允许通过向树中添加和删除节点来编辑树。 我要做的是每次单击树中的节点时更新面板中的变量“selectedNode”。
click事件的handler在Node组件里面,这里我想通知Panel一个Node被点击了,然后更新上面的变量。
这是我迄今为止所做的简化Plunkr
我研究了几种可能的解决方案,但没有找到任何适合我需要的解决方案。我知道@Output-EventEmitter 机制允许向父组件发送事件,但在我的情况下,节点的父节点是树(在根节点的情况下)或另一个节点(子节点)。
在 AngularJS 中,我使用 $emit 在单击节点时发送事件,并使用 $on 在 Panel 中捕获它并更新 selectedNode 变量。
在 Angular2 中,$emit$broadcast$on 事件机制不再可用。
我怎样才能达到我的目标?任何建议,即使不是基于事件的,都值得赞赏。
【问题讨论】:
标签: angular typescript