Componente Angular 2 @Input não está a funcionar

Estou a tentar passar um valor de propriedade para o meu componente. Pelo que li, tudo parece correcto. Mas ainda não está a funcionar. O meu valor de teste obtém a saída para o ecrã e a consola como nula. :(

Este é o meu componente de teste.:

import {Component, Input} from 'angular2/angular2';

@Component({
    selector: 'TestCmp',
    template: `Test Value : {{test}}`
})

export class TestCmp {

    @Input() test: string;

    constructor()
    {
        console.log('This if the value for user-id: ' + this.test);
    }
}
É assim que estou a chamar o componente da página dos pais.

<TestCmp [test]='Blue32'></TestCmp>

Quando o desenho da página é o valor do teste está vazio. Só vejo " valor de teste:".

em vez de "valor de ensaio" : Blue32'.

Author: Zameer Ansari, 2015-10-25

10 answers

Tens quatro coisas que eu posso notar:

  • você está passando uma entrada no componente raiz, que não vai funcionar.
  • Como @alexpods mencionou, você está usando o CamelCase. Não devias.
  • estás a passar uma expressão em vez de uma corda por [test]. Isso significa que o angular2 está procurando por uma variável chamada Blue32 em vez de passar uma corda crua.
  • Estás a usar o construtor. Isso não vai funcionar, deve ser depois da vista ter sido as propriedades inicializadas foram inicializadas (ver docs para OnInit).

Então, com algumas correcções, deve funcionar

exemplo actualizado para beta 1

import {Component, Input} from 'angular2/core';
import {bootstrap} from 'angular2/platform/browser';

@Component({
  selector : 'childcmp',
  template: `Test Value : {{test}}`
})
class ChildCmp {
    @Input() test: string;
    ngOnInit() {
        console.log('This if the value for user-id: ' + this.test);
    }
}

@Component({
    selector: 'testcmp',
    template : `<childcmp [test]="'Blue32'"></childcmp>`
    directives : [ChildCmp]
})
export class TestCmp {}

bootstrap(TestCmp);

Veja este plnkr {[17] } como um exemplo.

Actualizar

Eu vejo que as pessoas ainda chegam a esta resposta, então eu atualizei o plnkr para beta 1 e corrigi um ponto na explicação: você pode acessar as entradas no ngAfterViewInit, mas você pode acessá - las mais cedo no ciclo de vida dentro de ngOnInit.
 142
Author: Eric Martinez, 2016-01-13 12:29:19

É tão fácil como rodear o texto com aspas duplas, assim:

<TestCmp [test]="'Blue32'"></TestCmp>
 15
Author: fgonzalez, 2019-03-08 14:19:33

Se usar parêntesis [] o Angular usa a ligação à propriedade e espera receber uma expressão dentro das aspas e procura uma propriedade chamada 'Blue32' da sua classe de componentes ou uma variável dentro do modelo.

Se quiser passar o texto como um valor para o componente-filho, pode passá-lo assim:

<child-component childProperty='passing string'></child-component>

Ou

<child-component [childProperty]="'note double quotes'"></child-component>
E depois leva-o para a criança.componente.é assim:
import { Component, Input } from "@angular/core";

@Component({})
export class ChildComponent {

    @Input()
    childProperty: string;

}
 6
Author: Mulperi, 2019-03-28 13:17:15

Esta classe angular pode fazer o truque para atributos estáticos: ElementRef https://angular.io/docs/ts/latest/api/core/index/ElementRef-class.html

import {ElementRef} from 'angular2/core'

constructor(elementRef: ElementRef) {
    elementRef.nativeElement.getAttribute('api')
}
 5
Author: Charles HETIER, 2016-11-03 13:57:53
Acho que o problema aqui pode ter a ver com o ciclo de vida da página. Porque dentro do construtor o valor disto.o teste é nulo. Mas se eu adicionar um botão para o modelo ligado a uma função que empurra o valor para o console (o mesmo que eu estou fazendo no construtor) isso.o teste terá realmente um valor.
 2
Author: Zorthgo, 2015-10-25 05:48:02
Partilhar o que funcionou comigo.

Adicionar uma entrada à aplicação Angular 4

Assumindo que temos 2 componentes:
  • parent-component
  • child-component

Queríamos passar algum valor de parent-component para child-component i.e. um @Input de parent-component.html para child-component.ts. Segue-se um exemplo que explica a implementação:

parent-component.html parece isto:

<child-component [someInputValue]="someInputValue"></child-component>

parent-component.ts parece isto:

  
  class ParentComponent {

  someInputValue = 'Some Input Value';

}

child-component.html parece isto:

<p>Some Input Value {{someInputValue}}</p>

child-component.ts parece isto:


import { Component, OnInit, Input } from '@angular/core';

@Component({
  selector: 'child-component',
  templateUrl: './child-component.html'
})
export class ChildComponent implements OnInit {

  @Input() someInputValue: String = "Some default value";

  @Input()
  set setSomeInputValue(val) {
    this.someInputValue += " modified";
  }

  constructor() {
    console.log('someInputValue in constructor ************** ', this.someInputValue); //someInputValue in constructor ************** undefined
  }

  ngOnInit() {
    console.log('someInputValue  in ngOnInit ************** ', this.someInputValue); //someInputValue  in ngOnInit ************** Some Input Value
  }
}

Repare que o valor do valor @Input está disponível dentro ngOnInit() e não dentro constructor().

Comportamento de referência dos objectos em Angular 2 / 4

Em Javascript, os objectos são armazenados como referências .

Este comportamento EXACTO pode ser re-produzido com a ajuda do Angular 2 / 4. Segue-se um exemplo que explica a implementação:

parent-component.ts aparência assim:

  
  class ParentComponent {

  someInputValue = {input: 'Some Input Value'};

}

parent-component.html parece isto:

  
{{someInputValue.input}}



child-component.html parece isto:



Some Input Value {{someInputValue}}

change input

child-component.ts parece isto:


import { Component, OnInit, Input } from '@angular/core';

@Component({
  selector: 'child-component',
  templateUrl: './child-component.html'
})
export class ChildComponent implements OnInit {

  @Input() someInputValue = {input:"Some default value"};

  @Input()
  set setSomeInputValue(val) {
    this.someInputValue.input += " set from setter";
  }

  constructor() {
    console.log('someInputValue in constructor ************** ', this.someInputValue); //someInputValue in constructor ************** undefined
  }

  ngOnInit() {
    console.log('someInputValue  in ngOnInit ************** ', this.someInputValue); //someInputValue  in ngOnInit ************** Some Input Value
  }

  changeInput(){
    this.someInputValue.input += " changed";
  }
}

A função changeInput() irá alterar o valor de someInputValue dentro de ambos.ChildComponent & ParentComponent por causa da referência deles. Desde então, someInputValue é referenciado a partir de ParentComponent's someInputValue objeto - a alteração no ChildComponent's someInputValue objeto altera o valor de ParentComponent's someInputValue objeto. ISTO NÃO ESTÁ CORRECTO. Referência nunca será mudado.

 2
Author: Zameer Ansari, 2017-08-14 19:30:16

Talvez pareça um martelo , mas pode colocar a entrada embrulhada num objecto como este:

<TestCmp [test]='{color: 'Blue32'}'></TestCmp>

E muda de classe

class ChildCmp {
    @Input() test: any;
    ngOnInit() {
        console.log('This if the value for user-id: ' + this.test);
    }
}
 1
Author: jcmordan, 2016-07-23 22:51:55

Tem de importar input como este no topo do componente Infantil

import { Directive, Component, OnInit, Input } from '@angular/core';
 1
Author: Mukesh, 2017-02-23 15:38:45

Quando está a fazer uso de @Input para o angular interaction.It é sempre a abordagem preferida para passar os dados do pai para o filho no objeto JSON, aparentemente ele não restringe pela equipe @Angular a usar variável local ou variável estática.

No contexto para aceder ao valor do componente infantil, utilize ngOnInit () {} ciclo angular de vida independentemente do construtor.

Isso vai ajudar-te. Aplauso.
 0
Author: Sachin Mishra, 2017-07-15 08:18:29

Quando eu tinha este problema, havia na verdade apenas um erro de compilação que eu tinha que corrigir primeiro (dependência circular necessária resolvida).

 0
Author: James L., 2020-11-12 22:21:43