2017-01-02 2 views
1

Я изучаю Angular 2 В настоящее время я реализован Components as content.Показать содержимое на ngbModal при нажатии на строку таблицы - Угловая 2

У меня есть таблица на моем Bug-list.component.html, который подключается к firebase 3 считывает данные из таблицы ошибок и отображает эти данные в пределах таблицы, используя *ngFor, как показано здесь:

enter image description here

Когда Я нажимаю кнопку + Add Bug, появляется сообщение ngbModal, которое позволяет мне вводить новые данные и нажать save, который затем сохраняет до firebase - примечание: это работает как ожидалось.

Этот вопрос:

То, что я пытаюсь достичь, когда пользователь нажимает edit на любой из строк, я прохожу в UniqueID для ошибки и попытаться предварительно заполнить ngbModal с информацией о том, что ошибка, которая затем позволяет конечному пользователю редактировать его/сохранить или удалить его, я делаю это с помощью routerlink, как показано здесь:

<a [routerLink]="['/bug-detail', 1]"> 
    Edit 
</a> 

Однако, когда я нажимаю на «Edit» это текущее сообщение об ошибке I см. в консоли:

enter image description here

Я также пробовал программно программировать, но появляется та же ошибка.

Теперь внутри компонента я загружаю через ngbModal это .ts файл:

** Ошибка Деталь Компонент ** - Отображение содержимого об отдельных ошибках, которые загружаются через ngbModal.

import { Component, OnInit, Input, OnDestroy } from '@angular/core'; 
// Routing 
import { ActivatedRoute } from '@angular/router'; 
// Bootstrap 
import { NgbModal, NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; 
// Forms 
import { FormGroup, FormControl, Validators, FormBuilder } from '@angular/forms'; 
// Services 
import { BugService } from '../bugs/service/bug.service'; 
// Models 
import { Bug } from '../bugs/model/bug'; 
// Validators 
import { forbiddenStringValidator } from '../shared/validation/forbidden-string.validator'; 

@Component({ 
    selector: 'bug-detail', 
    templateUrl: './bug-detail.component.html', 
    styleUrls: ['./bug-detail.component.css'] 
}) 

export class BugDetailComponent implements OnInit { 

private bugForm: FormGroup; 
private id: number; 
private sub: any; 

@Input() currentBug = new Bug(null, null, null, null, null, null, null, null, null); 

constructor(private formBuilder: FormBuilder, private bugService: BugService, private route: ActivatedRoute, public activeModal: NgbActiveModal) { } 

ngOnInit() { 
    this.sub = this.route.params.subscribe(params => { 
     this.id = +params['id']; // (+) converts string 'id' to a number 
     console.log(this.id); 
    }); 

    this.configureForm(); 
} 

ngOnDestroy() { 
    this.sub.unsubscribe(); 
} 

configureForm() { 
    this.bugForm = new FormGroup({ 
     title: new FormControl(null, Validators.required), 
     status: new FormControl(1, Validators.required), 
     severity: new FormControl(1, Validators.required), 
     description: new FormControl(null, Validators.required) 
    }); 
} 

submitForm() { 
    this.addBug(); 
} 

addBug() { 
    this.currentBug.title = this.bugForm.value["title"]; 
    this.currentBug.status = this.bugForm.value["status"]; 
    this.currentBug.severity = this.bugForm.value["severity"]; 
    this.currentBug.description = this.bugForm.value["description"]; 
    this.bugService.addBug(this.currentBug); 
    this.activeModal.close(); 
} 

} 

Как вы можете видеть, что я импортировал NgbActiveModal внутри конструктора для данного компонента.

Теперь это мой bug-list.component.ts: - Отображает все ошибки на столе, и когда нажата кнопка + Add Bug, она вызывает функцию open.

import { Component, OnInit, ChangeDetectorRef } from '@angular/core'; 
import { BugService } from '../service/bug.service'; 
import { Bug } from '../model/bug'; 
import { NgbModal, NgbActiveModal, NgbModalRef, NgbModalOptions } from '@ng-bootstrap/ng-bootstrap'; 
import { BugDetailComponent } from '../../bug-detail/bug-detail.component'; 
import { ActivatedRoute, Router } from '@angular/router'; 


@Component({ 
    selector: 'bug-list', 
    templateUrl: './bug-list.component.html', 
    styleUrls: ['./bug-list.component.css'] 
}) 

export class BugListComponent implements OnInit { 

private bugs: Bug[] = []; 

constructor(private bugService: BugService, private cdRef: ChangeDetectorRef, private modalService: NgbModal, private route: ActivatedRoute, private router: Router) { } 

ngOnInit() { 
    this.getAddedBugs(); 
} 

getAddedBugs() { 
    this.bugService.getAddedBugs().subscribe(bug => { 
     this.bugs.push(bug); 
     this.cdRef.detectChanges(); 

    }, 
     err => { 
      console.error("unable to get added bug - ", err); 
     }); 
} 

open(options: NgbModalOptions = { size: 'lg' }): NgbModalRef { 
    const modalRef = this.modalService.open(BugDetailComponent, options); 
    modalRef.componentInstance.name = 'bugDetail'; 
    return modalRef; 
} 


} 

Так что мой вопрос, как я могу передать в ID по ошибке нажал на bug-detail.compoenent, заселить этот компонент со значениями, связанными с этой ошибкой, а затем отобразить модальный снова, позволяя пользователю редактировать/удалить ,

Несомненно, должен быть способ передать уникальный идентификатор, заполнить поля на ngbModal и затем отобразить его.

Update

ИТАК после выполнения component communication я создал службу:

import { Injectable } from '@angular/core'; 
import { Subject } from 'rxjs/Subject'; 

@Injectable() 
export class BugCommunication { 

// Literally copied straight from example. 

private missionAnnouncedSource = new Subject<string>(); 

missionAnnounced$ = this.missionAnnouncedSource.asObservable(); 

announceMission(mission: string) { 
    this.missionAnnouncedSource.next(mission); 

    console.log(mission); 

} 

} 

Эта услуга вводится в Bug-list.component.ts, когда пользователь нажимает кнопку редактирования, я затем вызвать вышеуказанную услугу, проходящей в значении как показано здесь:

editBug(bug: Bug) { 

    let mission = "Testing sevice"; 

    this.comServe.announceMission(mission); 
    this.history.push(`Mission "${mission}" announced`); 

} 

Примечание: comServe - это название упомянутый выше сервис после его импорта.

Служба затем console.logs «Служба тестирования».

Внутри моего bug-detail.component.ts подписаться на вышеприведенном случае, как показано здесь:

ngOnInit() { 
    this.subscription = this.comServe.missionAnnounced$.subscribe(
     mission => { 
      console.log(mission); 
     }); 

    this.configureForm(); 
} 

Однако всякий раз, когда я нажимаю на кнопку редактирования и вызова службы, bug-detail.component ничего не к консоли журнала.

Я правильно импортировал эту услугу в Module, может кто-то объяснить, что я делаю неправильно?

ответ

0

Похоже, что ваш метод подписки не получает значение .next() из вашей службы.

this.missionAnnouncedSource.next(mission); 

Я считаю, что это потому, что ваш наблюдаемым наблюдает в собственность миссии, в то время как ваша служба посылает сообщение как безымянные собственности. Ака: следующая (строка) Две секции кода, которые необходимо будет изменить

баг-detail.component.ts

.subscribe(
    mission => { 
     console.log(mission); 
    }); 

BugCommunication

this.missionAnnouncedSource.next(mission); 

Вот твердый пример: http://jasonwatmore.com/post/2016/12/01/angular-2-communicating-between-components-with-observable-subject

 Смежные вопросы

  • Нет связанных вопросов^_^