“Privado” e “público” no componente Angular

120

Se eu não adicionar privado antes foo, loadBare text, acredito que eles são públicos por padrão.

export class RandomComponent {
  @Input() foo: string;
  @Output() loadBar = new EventEmitter();
  text: string;
}

Existe algum caso de uso quando eles estão publicno componente?

Por motivos de encapsulamento / segurança, devo sempre adicionar privatepara todos eles como abaixo?

export class RandomComponent {
  @Input() private foo: string;
  @Output() private loadBar = new EventEmitter();
  private text: string;
}

obrigado

Hongbo Miao
fonte
Para ser simples, uma função privada só pode ser usada no componente. Não é possível acessar uma função privada de outro componente. Suponha que em serviço, se uma função for declarada como Privada, ela não poderá ser acessada de qualquer outro componente.
Kevin

Respostas:

202

Há muito a dizer em resposta a esta pergunta, estes são os primeiros pensamentos que me vieram à mente:

Em primeiro lugar, tenha em mente que privateé apenas uma construção de tempo de compilação - ela não pode ser imposta em tempo de execução (veja aqui e aqui uma discussão relevante). Como tal, por favor, desligue-se de quaisquer noções deprivate ser útil de alguma forma para fins de segurança. Simplesmente não é disso que se trata.

Ele é cerca de encapsulamento, e quando você tem um campo ou método na sua componente que você deseja encapsular nela, deixando claro que ele não deve ser acessado a partir de qualquer outro lugar, então você deve absolutamente torná-lo private: isso é o que privateé para: Sinaliza sua intenção que tudo o que você colocou não deve ser tocado de fora da classe.

O mesmo vale para public: ele também é uma construção apenas em tempo de compilação, então o fato de que os membros da classe são publicpor padrão, embora verdadeiro, tem significado exatamente zero em tempo de execução. Mas quando você tem um membro que pretende explicitamente expor ao mundo externo como parte da API de sua classe, você deve com certeza torná-lo publicpara sinalizar esta intenção: É para isso que publicserve.

Tudo isso é aplicável ao Typecript em geral. Especificamente em Angular, há casos de uso definitivamente válidos para ter membros públicos em classes de componentes: Por exemplo, ao implementar o contêiner / componente (também conhecido como inteligente / burro padrão de ), com crianças "burras" injetando pais "inteligentes" por meio de injeção de construtor, é extremamente importante comunicar sua intenção sobre o que os membros do pai devem e não devem ser tocados pelos filhos: Do contrário, não se surpreenda quando pegar essas crianças idiotas brincando no armário de bebidas de seus pais.

Então, minha resposta à sua pergunta:

devo sempre adicionar privado para todos eles como abaixo?

é um enfático não . Você nem sempre deve adicionar privateporque, ao fazer isso, você anula o propósito da palavra-chave, porque ela não sinaliza mais nenhuma intenção se você colocá-la em qualquer lugar: você pode muito bem não colocá-la em qualquer lugar.

desenhou Moore
fonte
5
Obrigada pelo esclarecimento. Mas talvez eu esteja errado: eu entendo que na maioria das vezes as propriedades e métodos têm que ser privados (= "para este componente usar apenas"). Então a resposta deve ser “SIM por padrão, desde que o cara não precise expor a propriedade / método para fora”. Não ? Por que concluir sua explicação respondendo "não" (que soa como um "nunca")?
M'sieur Toph '21 de
1
Eu marquei o Angulo 2 tutoriais e não descobri quando deveria usar o público. Existem muitas variantes para a comunicação de componente: angular.io/docs/ts/latest/cookbook/… Provavelmente, devemos usar público apenas para propriedades e métodos definidos via Input Output. Mas eu não tenho certeza.
Ruslan Borovok
Normalmente, tenho que usar 'public' quando declaro uma propriedade no construtor que não é usada dentro da classe, mas é usada fora (isto é, dentro de um modelo ou outro componente).
tuliomarchetto de
18

@drewmoore fornece uma boa resposta em que privado / público se resume à intenção. Mas há mais algumas coisas a considerar ao usar valores privados injetados:

Se quisermos emitir TypeScript como saída do processo de compilação AoT, devemos ter certeza de acessar apenas os campos públicos nos modelos de nossos componentes **

Lucas
fonte
re seu primeiro ponto: Esses erros não têm nada a ver com um membro ser privado ou público, eles simplesmente indicam que um não é usado. Seus dois segundos pontos seriam válidos se a questão fosse sobre como fazer referência a membros privados em modelos , mas não é. Veja aqui uma pergunta que é
desenhou moore em
@drewmoore, você está correto e entendo que eles indicam que não são usados. No entanto, as variáveis ​​públicas podem ser usadas externamente, de modo que nunca disparariam esse aviso. Quanto às próprias questões "Existe algum caso de uso quando são públicos no componente?", Acredito que meu segundo e terceiro pontos indicam pelo menos um caso de uso quando são públicos , especificamente, quando você deseja usá-los no modelo (conforme indicado no texto citado).
Lucas de