多くのコンポーネントを持つ典型的な角度2のアプリケーションがあります。
私はこのモーダルコンポーネントをインストールしました:https://github.com/pleerock/ng2-modal。
より多くのコンポーネント間で同じモーダルを共有する方法はありますか? 私はよく説明します。私は同じモダールを別のコンポーネント内の異なるボタンをクリックして開く必要があります。出来ますか?コンポーネント間で角の2つのモーダルを共有する
私はこのようなアプローチを試みましたが、常にモーダルにコンテンツを追加するので、正しい方法ではありません。
私はapp.tsファイルの下にそれをここに投稿:
21/12/2016更新
が@echonaxの提案に続いて、私は私のplunkを更新:
//our root app component
import {
NgModule,
ComponentRef,
Injectable,
Component,
Injector,
ViewContainerRef,
ViewChild, ComponentFactoryResolver} from "@angular/core";
import {BrowserModule} from '@angular/platform-browser'
import {Subject} from 'rxjs/Subject';
@Injectable()
export class SharedService {
showModal:Subject<any> = new Subject();
}
@Component({
selector: 'child-component',
template: `
<button (click)="showDialog()">show modal from child</button>
`,
})
export class ChildComponent {
constructor(private sharedService:SharedService) {}
showDialog() {
this.sharedService.showModal.next(CompComponent);
}
}
@Component({
selector: 'comp-comp',
template: `MyComponent`
})
export class CompComponent { }
@Component({
selector: 'modal-comp',
template: `
<div class="modal fade" id="theModal" tabindex="-1" role="dialog" aria-labelledby="theModalLabel">
<div class="modal-dialog largeWidth" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title" id="theModalLabel">The Label</h4></div>
<div class="modal-body" #theBody>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal" (close)="close()">Close</button>
</div></div></div></div>
`
})
export class ModalComponent {
@ViewChild('theBody', {read: ViewContainerRef}) theBody;
cmp:ComponentRef<any>;
cmpRef:ComponentRef<any>;
constructor(
sharedService:SharedService,
private componentFactoryResolver: ComponentFactoryResolver,
injector: Injector) {
sharedService.showModal.subscribe(type => {
if(this.cmp) {
this.cmp.destroy();
}
let factory = this.componentFactoryResolver.resolveComponentFactory(type);
this.cmpRef = this.theBody.createComponent(factory)
$('#theModal').modal('show');
});
}
close() {
if(this.cmp) {
this.cmp.destroy();
}
this.cmp = null;
}
}
@Component({
selector: 'my-app',
template: `
<div>
<h2>Hello</h2>
<button (click)="showDialog()">show modal</button>
<child-component></child-component>
</div>
`,
})
export class App {
constructor(private sharedService:SharedService) {}
showDialog() {
this.sharedService.showModal.next(CompComponent);
}
}
@NgModule({
imports: [ BrowserModule ],
declarations: [ App, ModalComponent, CompComponent, ChildComponent],
providers: [SharedService],
entryComponents: [CompComponent],
bootstrap: [ App, ModalComponent ]
})
export class AppModule{}
滞在をチューニング! plunkerのオリジナルバージョンは、実際に私の質問であることを
あなたは何を試してみましたか?それを参照して、動作していないコードを投稿して、ヘルプを入手しようとしてください。あなたが何かを試して、修正を必要とするとき、誰かにあなたのためにそれをやるように求めるのではなく、人々はより多くの助けを得て応答します。 –
さて、私はしました。とにかく、私が試したアプローチは、私が必要なものに合っていたので、投稿するのが役に立つとは思わなかった。私は昨日の午後全体を挑戦しました、それは怠惰でした。 –
そのプランカーのオリジナルバージョンは実際に私の質問です:http://stackoverflow.com/questions/36566698/how-to-dynamically-create-bootstrap-modals-as-angular2-componentsと@Günterは私が思うに素晴らしい答えを出しました本当に過小評価されている。ちょっと間違いがありますが、私はGünterに説明しますが、ここで固定バージョンを見つけることができます:https://plnkr.co/edit/oMCZIJq58WdLgYf2D0Di?p=preview – echonax