속성 'X'는 비공개이며 클래스 'xyzComponent' 내에서만 액세스할 수 있습니다.
저는 이 블로그를 팔로우하고 있는 제작용 angular2 어플리케이션을 작성하려고 합니다.ncc 컴파일에 성공한 후 tsc 컴파일이 실행되면 이미지에 표시된 다음 오류가 발생합니다.
잠시 검색해 본 결과, 이 블로그에서는, 「콘텍스트 속성」섹션의 문제를 설명하고 있습니다만, 제대로 이해할 수 없는 것은, 무엇이 잘못되고 있는지를 알 수 있는 것일지도 모릅니다.기본적으로 변수를 비공개로 하면, 「ERROR: Property는 프라이빗이며 클래스내에서만 액세스 할 수 있습니다」라고 하는 메세지가 표시됩니다.
특정 컴포넌트에 대해 템플릿에서 액세스하는 모든 멤버(메서드, 속성)는 AOT 컴파일 시나리오에서 공개되어야 합니다.이는 템플릿이 TS 클래스로 변환되기 때문입니다.생성된 클래스와 컴포넌트는 현재 2개의 개별 클래스가 되어 있으며 클래스 간 개인 멤버에 액세스할 수 없습니다.
즉, 사전 컴파일을 사용하려면 템플리트의 개인 구성원에 액세스할 수 없습니다.
자세한 것은, https://github.com/angular/angular/issues/11422 를 참조해 주세요.
또 다른 간단한 답은 다음과 같습니다.
여러분, HTML에서 개인 메서드, 필드 또는 속성을 호출하지 마십시오.
P.S. 컴파일 시*.ts
에 암호를 붙이다.*.js
, AOT는 비공개 멤버와 HTML 템플릿의 접속을 거부합니다.
"예"라고 대답하면 빌드 파이프라인이 실패하게 됩니다.D
건설업자에 사설 주사기라고 선언했을 때 이걸 받았죠
constructor(private service: SpecificObjectService) { }
그리고 템플릿에 그것들을 사용했습니다.
*ngFor="let pd of service.listSpecificObject "
해결책은 다음과 같습니다.
constructor(public service: SpecificObjectService) { }
그래서 저는 이 문제를 해결했습니다. 이 문제를 짧고 단순하게 유지하겠습니다.이것을 고치기 위해 나는 이 블로그를 깊이 읽었다."콘텍스트 속성" 섹션과 같이 이 문제의 해결 방법은 가 프로덕션용 AOT(즉, 사전 시간)를 사용하여 빌드를 작성할 때 뷰에서 직접 사용할 경우 개인 변수를 사용하거나 생성하지 마십시오.
* 예 *
// component.ts
@Component({
selector: 'third-party',
template: `
{{ _initials }}
`
})
class ThirdPartyComponent {
private _initials: string;
private _name: string;
@Input()
set name(name: string) {
if (name) {
this._initials = name.split(' ').map(n => n[0]).join('. ') + '.';
this._name = name;
}
}
}
출력: 속성 '_initials'는 비공개로 클래스 'ThirdPartyComponent' 내에서만 액세스할 수 있습니다.
솔루션:
이것을 갱신private _initials: string;
간단히 말하면_initials: string;
Harish Gadya는 이 대답을 위해 나에게 도움을 주었다.
난 이게 좋아.서비스를 퍼블릭으로 변경하기만 하면 됩니다.
constructor(public service: SpecificObjectService) { }
실제 가동 중인 앱!!
뷰에서 라우터를 사용하고 싶다면 공개해 주세요.
예:
<button
[routerLink]="['/login']"
[queryParams]="{redirectTo: router.url}"
translate="Please sign in to use this feature"
/>
import { Router } from '@angular/router';
constructor(
public router: Router; // don't make it private
) {}
Github CI가 경고 메일을 보내기 전까지 못 본 척 했어요.
ok 이것은 정말 단순한 javascript es6의 문제입니다.데이터 타입을 비공개로 할 필요가 있는 경우는, 간단하게 실시할 수 있습니다.
privateAccess(){
return this.cannotAccessByInstanceButStillNeeded
}
수 요.// @ts-ignore
이 에러의 원인이 되고 있는 행보다 앞에 표시됩니다.문서 확인
변수 앞에 있는 '개인' 액세스 한정자를 제거하기만 하면 됩니다.생성자에서 선언된 인스턴스인 경우 'private'를 'public'으로 변경합니다.
개인 메서드에 액세스하려면 테스트에서 를 사용해 보십시오.
spyOn(component as any, 'yourPrivateMethod').and.returnValue(...);
그리고.
expect((component as any).yourPrivateMethod).toHaveBeenCalled();
언급URL : https://stackoverflow.com/questions/43141576/property-x-is-private-and-only-accessible-within-class-xyzcomponent
'programing' 카테고리의 다른 글
Angular Routed 컴포넌트에 데이터를 전달하려면 어떻게 해야 합니까? (0) | 2023.03.13 |
---|---|
woocommerce 체크아웃 페이지에 업데이트된 데이터 표시 (0) | 2023.03.13 |
C#의 Json 문자열 해석 (0) | 2023.03.13 |
SQL Server에서 Oracle의 "SELECT FOR UPDATE WAIT"와 유사한 방법으로 단일 행을 잠그려면 어떻게 해야 합니까? (0) | 2023.03.13 |
Threejs를 React에 연결하는 방법 (0) | 2023.03.13 |