使用angular2从组件子级到组件父级获取值

时间:2017-09-19 15:21:14

标签: angular get components

我在我的子组件中开发了一个自动完成,我在父组件中多次包含,一切正常,现在我有一个问题,如何从我的父组件中获取每个自动完成的选定值。我想要它,当我点击搜索按钮,检索方法中的值" popupCopyLookupModel()"但是当我要求"这时。" +"以及自动完成名称"总是让我不确定。我认为这部分做得不对。有任何想法吗? autocomplete.component.ts(component child):

@Component({
selector: 'app-autocomplete',
templateUrl: './autocomplete.component.html',
styleUrls: ['./autocomplete.component.css'],
host: {
    '(document:click)': 'handleClick($event)',
},
})
export class AutocompleteComponent implements OnInit {

@Input() public filteredList = [];

private estilosListaAC = new EstilosLista();
private propiedadesListaAC = new PropiedadesLista();
private propiedadesInputAC = new PropiedadesInput();
@Input() opciones : OpcionesAutocomplete;  

//Origen de datos, se lo pasamos desde el componente padre:
@Input() dataSource:any[];
@Input() dataSubject:Subject<any[]>;
@Input() propiedad1:string = "";
@Input() propiedad2:string = "";
@Input() classInput:string = "";
@Input() textoLabel:string = ""; 


//Valor tecleado en el input:
public query = '';
public elementRef; 
private _dataSource:any[];    
private _opciones:OpcionesAutocomplete;

getData(): Observable<any[]> {
if (this.dataSubject) 
{
  return this.dataSubject.asObservable();
}
else
{
  return Observable.of([]);
}
} 

//El propio componente:
constructor(myElement: ElementRef) {
  this.elementRef = myElement;
}    

ngOnInit() {  
//Establecemos el origen de datos que nos llega del componente padre:
this._dataSource = this.dataSource;
this.getData().subscribe((x) => {
  if (x && x.length > 0)
    this._dataSource = x;
  },
  error => { console.log("Error en al recuperar datos en Autocomplete") }
);
//Establecemos las opciones por defecto, si no nos llegan del componente padre, cogemos las definidas en este propio componente:    
if (this.opciones instanceof OpcionesAutocomplete){
  this._opciones = this.opciones;
  if (this._opciones.propiedadesLista instanceof PropiedadesLista){
    this.propiedad1 = this._opciones.propiedadesLista.propiedad1;
    this.propiedad2 = this._opciones.propiedadesLista.propiedad2;
  }
  if (this._opciones.propiedadesInput instanceof PropiedadesInput){
    this.textoLabel = this._opciones.propiedadesInput.texto;
    this.classInput = this._opciones.propiedadesInput.class;
  }
}else{
  this.textoLabel = "Sin Configurar";
}     
} 

//Se lanza cuando se selecciona un elemento de la lista:
select(item){
  //this.query = item
  if (item[this._opciones.propiedadesLista.propiedad1] !== undefined)
  {
      this.query = item[this._opciones.propiedadesLista.propiedad1]
  }
  if (item[this._opciones.propiedadesLista.propiedad2] !== undefined) {
      this.query = this.query + ' ' + item[this._opciones.propiedadesLista.propiedad2];
  }
  //this.query  = item.propiedad1 + item.propiedad2;
  this.filteredList = [];
}
}

busquedacopiadora.component.html(组件父亲):

<app-autocomplete id="selectCliente" [dataSubject]="clientesSub"      
    [dataSource]="clientes"> 
</app-autocomplete>

<app-autocomplete id="selectProveedor" [dataSubject]="proveedoresSub"  
    [dataSource]="proveedores" [opciones]="opcionesAutocompleteProveedores"> 
</app-autocomplete>



<button type="button" class="btn btn-primary botonBuscar" 
(click)="rellenarCopiadoraBusquedaModel($event)">
    <span class="glyphicon glyphicon-search"></span> Search
</button>

busquedacopiadora.component.ts(组件父亲):

rellenarCopiadoraBusquedaModel() 
{
    if (this.selectCliente !== undefined && this.selectCliente !== 0) 
    {                
       console.log('Cliente: ' + this.selectCliente);
    }

    if (this.selectProveedor !== undefined && this.selectProveedor !== 0) 
    {                
        console.log('Cliente: ' + this.selectProveedor);
    }
}

1 个答案:

答案 0 :(得分:0)

如果是多个,您可以使用ViewChild装饰器(如果是单个自动完成)或ViewChildren 例如

export class AppComponent implements OnInit {  @ViewChild(HeaderComponent)header: HeaderComponent;

在这里,您告诉Angular获取任何子HeaderComponent类型的引用。 从该引用中,您可以访问父组件中组件的所有属性。