programing

속성 'X'는 비공개이며 클래스 'xyzComponent' 내에서만 액세스할 수 있습니다.

bestprogram 2023. 3. 13. 21:09

속성 '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