Angular 구성 요소의 "private"및 "public"
내가 추가하지 않으면 개인을 하기 전에 foo
, loadBar
그리고 text
, 나는 그들이 믿고 대중 기본적으로.
export class RandomComponent {
@Input() foo: string;
@Output() loadBar = new EventEmitter();
text: string;
}
public
구성 요소에 있을 때 사용 사례가 있습니까?
캡슐화 / 보안상의 이유로 항상 private
아래와 같이 모두 추가해야 합니까?
export class RandomComponent {
@Input() private foo: string;
@Output() private loadBar = new EventEmitter();
private text: string;
}
감사
이 질문에 대한 답변으로 할 말이 많이 있는데, 이것이 내 마음에 떠오른 첫 번째 생각입니다.
무엇보다 먼저 private
컴파일 타임 구조 일 뿐이며 런타임에 적용 할 수 없습니다 ( 관련 논의는 여기 와 여기 를 참조 하세요 ). 따라서 private
보안 목적으로 어떤 식 으로든 유용하다는 생각을 버리십시오 . 그것은 단순히 그것이 무엇에 관한 것이 아닙니다.
그것은 이다 캡슐화에 대해, 당신이 당신의 구성 요소에 필드 나 메소드가있을 때 당신이 그것을 다른 곳에서 액세스 할 수 없습니다 것을 취소하고, 거기에 캡슐화 할 것인지, 당신은 절대적으로 그것을 확인해야합니다 private
: 그것은 무엇의 private
입니다 : 무엇을 입었 든 수업 외부에서 건드리지 말아야한다는 의도를 나타냅니다.
똑같습니다 public
: 이것도 컴파일 시간 전용 구조이므로 클래스 멤버가 public
기본적으로 true이지만 런타임에 정확히 0의 의미를 갖습니다. 그러나 클래스 API의 일부로 외부 세계에 명시 적으로 노출하려는 멤버가있는 public
경우이 의도를 알리기 위해 절대적으로 만들어야합니다 . 이것이 바로 그 이유 public
입니다.
이것은 일반적으로 Typescript에 모두 적용됩니다. 특히 Angular에는 구성 요소 클래스에 공용 멤버를 사용하는 데 유효한 사용 사례가 있습니다. 예를 들어 컨테이너 / 구성 요소 (일명 smart / dumb ) 패턴을 구현할 때 "dumb"자식이 생성자 주입을 통해 "스마트"부모를 주입하는 경우, 부모의 구성원이 자녀가 만져서는 안되는 것과 접촉해서는 안되는 것에 대한 의도를 전달하는 것이 매우 중요합니다. 그렇지 않으면 부모의 술 캐비닛에서 장난을 치는 멍청한 아이를 잡을 때 놀라지 마십시오.
그래서, 귀하의 질문에 대한 나의 대답 :
항상 아래와 같이 모두 비공개로 추가해야합니까?
단호한 아니오 입니다. 항상 추가 해서는 안됩니다. private
이렇게하면 키워드의 목적이 무효화됩니다. 왜냐하면 키워드를 어디에나두면 더 이상 의도를 나타내지 않기 때문입니다. 어디에도 넣지 않는 것이 좋습니다.
@drewmoore는 개인 / 공개가 의도로 요약된다는 점에서 좋은 답변을 제공합니다. 그러나 주입 된 개인 값을 사용할 때 고려해야 할 몇 가지 사항이 더 있습니다.
- 두 타이프 라이터 ( noUnusedLocals )와 tslint ( 노 미사용 변수 )를 사용하는 경우 오류를보고합니다
@Import() private foo
, 또는constructor(private foo) {}
, 만 사용하는foo
템플릿에 - AOT가 작동하지 않습니다 .
TypeScript를 AoT 컴파일 프로세스의 출력으로 내보내려면 구성 요소 템플릿의 공용 필드에만 액세스해야합니다 **
- 그것은되는 안티 패턴을 고려
참고 URL : https://stackoverflow.com/questions/37506343/private-and-public-in-angular-component
'code' 카테고리의 다른 글
Retina 디스플레이, 고해상도 배경 이미지 (0) | 2020.08.25 |
---|---|
자바 이름 숨기기 : 어려운 길 (0) | 2020.08.25 |
RSpec 컨트롤러 테스트-빈 response.body (0) | 2020.08.25 |
VB.NET에서 DirectCast ()와 CType ()의 차이점 (0) | 2020.08.25 |
항아리를 추출하고 다시 만들지 않고도 Jar / war에서 파일을 빠르게 삭제할 수있는 방법이 있습니까? (0) | 2020.08.25 |