假设我有一个如下所示的 Angular 服务:
@Injectable()
export class Clipboard {
constructor(private multiple: Multiple, private di:DI, private injected:Injected, private things: Things){}
// The clipboard has local state:
private isCut: boolean;
private toPaste: Hero;
cut(hero: Hero){
this.isCut = true;
this.toPaste = hero;
}
copy(hero: Hero){
this.isCut = false;
this.toPaste = hero;
}
paste(locaction: Location){
// Lots of really complex logic
}
canPaste(potentialLocation: Location){
// Lots of really complex logic
}
}
目前我有几个使用剪贴板服务的组件。
当您右键单击英雄时,您可以复制/剪切它们。以后,在同一个组件或者不同的组件中,都可以粘贴英雄。像这样的东西:
@Component({
...
})
export class HeroTable {
constructor(private clipboard: Clipboard){}
cutHero(hero: Hero): void {
this.clipboard.cut(hero);
}
}
我现在想向我的组件添加拖放功能。有趣的是,拖放的,和 方法是相同的,但是我需要使用剪贴板的单独实例来防止以下canPaste
情况:paste
cut
copy
- 用户剪辑“蝙蝠侠”
- 用户将“超人”拖放到新位置
- 用户尝试粘贴“蝙蝠侠”,但不幸的是剪贴板已被拖放污染。
我可以创建一个名为DragDrop
扩展剪贴板的新类:
@Injectable()
export class DragDrop extends Clipboard{
// Drag and Drop behaves identically to the Clipboard. Please
// don't override any behaviour here. This class is a hack to
// get a second injectable instance of Clipboard.
}
这允许我像这样更新 HeroTable:
@Component({
...
})
export class HeroTable {
constructor(private clipboard: Clipboard, private dragDrop: DragDrop){}
cutHero(hero: Hero): void {
this.clipboard.cut(hero);
}
dragHer(hero: Hero): void {
this.dragDrop.cut(hero);
}
}
这也允许我在另一个组件中使用剪贴板的两个实例,并告诉哪个是哪个。我需要确保所有组件都知道哪个剪贴板应该用于剪切/粘贴,哪个应该用于拖放。
不幸的是,这个解决方案感觉就像一个黑客。有没有一种 Angular 有福的方式来做到这一点?
我发现了这个问题:Angular2:如何使用同一服务的多个实例?这看起来非常相似,但是我希望鉴于我提供的详细信息,我可能会得到略有不同的回应。