Я пытаюсь отправить данные в пользовательский компонент модального контента, чтобы я мог вызывать его из любого другого компонента, а не повторять код. Я новичок в Angular 2 и следил за демо-версией ng-boostrap «Компоненты как контент», а также «Компонентное взаимодействие» в Angular docs и не нашел способа заставить это работать или пример для этого случая ,Angular 2 ng-bootstrap Модально: как передать данные в компонент ввода
Я могу получить модальный, чтобы открыть, но не с динамическим контентом. Я пробовал @Input
и переменный подход без успеха. Я также добавил ModalService
поставщикам в app.module.ts
. Это то, что я с обоими подходами, что не работает:
page.component.html:
<a (click)="modal('message')">
<template ngbModalContainer><my-modal [data]="data"></my-modal></template>
page.component.ts:
import { Component } from '@angular/core'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { ModalService } from '../helpers/modal.service'
import { ModalComponent } from '../helpers/modal.component'
@Component({
selector: 'app-page',
templateUrl: './page.component.html',
styleUrls: ['./page.component.scss'],
entryComponents: [ ModalComponent ]
})
export class PageComponent {
data = 'customData'
constructor (
private ngbModalService: NgbModal,
private modalService: ModalService
) { }
closeResult: string
modal(content) {
this.data = 'changedData'
this.modalService.newModal(content)
this.ngbModalService.open(ModalComponent).result.then((result) => {
this.closeResult = `Closed with: ${result}`
}, (reason) => {
this.closeResult = `Dismissed ${reason}`
});
}
}
modal.service.ts:
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class ModalService {
private modalSource = new Subject<string>()
modal$ = this.modalSource.asObservable()
newModal(content: string) {
this.modalSource.next(content)
}
}
modal.component.ts:
import { Component, Input, OnDestroy } from '@angular/core';
import { Subscription } from 'rxjs/Subscription';
import { ModalService } from './modal.service'
@Component({
selector: 'my-modal',
template: `
<div class="modal-body">
{{data}}
{{content}}
</div>
`
})
export class ModalComponent implements OnDestroy {
@Input() data: string
content = 'hello'
subscription: Subscription
constructor(
private modalService: ModalService
) {
this.subscription = modalService.modal$.subscribe(
content => {
this.content = content
});
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
}
Использование углового V2.1.0, угловой-кли v1.0.0-beta.16, нг-самозагрузки v1.0.0-alpha.8
Благодаря Гюнтер, я вернулся и реализовал сервис (см отредактированной записи), но она по-прежнему не работает. Возможно, ngbModalService создает новый экземпляр моего модального компонента, чтобы они не обменивались данными. Любые идеи, видящие обновление? – asabido
Либо предоставить услугу в корневом компоненте, либо сделать его однопользовательской службой. Он должен работать. – ZooZ
Где вы можете написать "ModalService"? Сколько экземпляров вы получаете, зависит от того, где вы его предоставляете. Если вы добавите его в «поставщиков» компонента, каждый такой компонент получит собственный экземпляр. Если вы добавите его в 'провайдеры'' @NgModule() '(не-ленивый загружен), то для всего приложения будет создан только один экземпляр. –