次のような Angular Service があるとします。
@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 を更新できます: j
@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);
}
}
これにより、クリップボードの 2 つのインスタンスを別のコンポーネントで使用して、どちらがどちらであるかを判断することもできます。切り取り/貼り付けに使用するクリップボードとドラッグ/ドロップに使用するクリップボードをすべてのコンポーネントが認識していることを確認する必要があります。
残念ながら、このソリューションはハックのように感じます。これを行うAngularの祝福された方法はありますか?
この質問を見つけました: Angular2: 同じサービスの複数のインスタンスを使用するには? これは非常に似ているように見えますが、私が提供している詳細を考えると、わずかに異なる応答が得られることを願っています.