передавать данные между бабушкой и дедушкой и дочерним угловым 2

в angular2 у меня есть компонент addproperty (дедушка) и компонент addproperty2 (родительский) и компонент флажка (дочерний). В дедушке и дедушке есть форма с кнопкой добавить, если пользователь нажмите флажки, которые находятся в родительском компоненте, и снова появится кнопка добавить. дедушка html:

    <div *ngIf="page2">
      <add-property-page2></add-property-page2>
    </div>

    <div class="text-center col-sm-12">
      <button [disabled]="!propertyForm.form.valid"
              (click)="onSubmit($event,value,amlak)"
              type="submit" class="btn btn-success">Add
      </button>
    </div>

Это означает, что если page2 имеет значение true, он показывает родительский html внутри дедушки и бабушки. прародительский компонент:

import {Component, OnInit, ViewChild, ViewEncapsulation,Input} from '@angular/core';
import {AddPropertyPage2Component} from "./add-paroperty-page2.component";
@Component({
selector: 'add-property',
templateUrl: './add-property.html'
})
export class AddPropertyComponent implements OnInit {
private page2: boolean;
@ViewChild(AddPropertyPage2Component)
private checkbox: AddPropertyPage2Component;
onSubmit($event: any) {
$event.preventDefault();
if(this.page2){
  this.amlak.emkanat = this.checkbox.emkan.filter(e=>e.checked == true);
 }
}

родительский html:

<div class="col-md-12 form-group">
<checkbox></checkbox>
 </div>

родительский компонент:

import {Component, OnInit,ViewChild} from '@angular/core';
import {CheckBoxComponent} from './checkbox.component';
@Component({
selector:'add-property-page2',
templateUrl:'./add-property-page2.html',
})
export class AddPropertyPage2Component{
 @ViewChild(CheckBoxComponent)
 private checkboxcomponent: CheckBoxComponent;
 public emkan = this.checkboxcomponent.emkanats;
  }

и компонент флажка:

import {Component, OnInit} from '@angular/core';
import {checkBoxClass} from '../models/checkboxClass';
import {CheckBoxService} from '../services/checkbox.service';
@Component({
selector: 'checkbox',
styleUrls: ['./checkbox.css'],
templateUrl: './checkbox.html',
})
 export class CheckBoxComponent implements OnInit {
 public emkanats: checkBoxClass[];

 constructor(private checkboxService: CheckBoxService) {
  }

  ngOnInit() {
  this.checkboxService.getCheckboxes().subscribe(res => this.emkanats = 
  res);
  }
  }

это класс флажка:

export class checkBoxClass {
title:string;
 value:string;
checked:boolean;
 image:number;
 }

служба флажков:

import {Injectable} from '@angular/core';
import {checkBoxClass} from '../models/checkboxClass';
import {Http,Headers,Response} from '@angular/http';
 import { Observable }     from 'rxjs/Observable';
 import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';

@Injectable() export class CheckBoxService{
 private checkboxUrl:string = '../../checkbox.json';

 constructor(private http:Http){}

 getCheckboxes(): Observable<checkBoxClass[]> {
  return this.http.get(this.checkboxUrl)
  .map(response => response.json())
 }
 }

Теперь ошибка такова: Невозможно прочитать свойство 'emkan' неопределенного. Я использовал метод viewchild в двух компонентах, но не знаю причины этой ошибки. Не могли бы вы помочь мне решить эту проблему, используя метод viewchild? Большое спасибо.


person Amir Gh    schedule 10.09.2017    source источник
comment
Можно ли сделать плунжер?   -  person Vega    schedule 10.09.2017
comment
Привет. Попробуйте использовать хук жизненного цикла ngAfterViewInit в вашем компоненте AddPropertyPage2Component для чтения данных из emkanats из переменной checkboxcomponent. См. angular.io/guide/lifecycle-hooks.   -  person ChrisY    schedule 10.09.2017
comment
Вам нужно использовать общий сервис. Используйте такой подход: stackoverflow.com/a/45710245/1791913   -  person Faisal    schedule 10.09.2017