Thuộc tính 'X' là riêng tư và chỉ có thể truy cập trong lớp 'xyzComponent'


97

Tôi đang cố gắng xây dựng ứng dụng angle2 để sản xuất mà tôi đang theo dõi blog này . Sau khi biên dịch thành công ngc của tôi khi quá trình biên dịch tsc diễn ra, nó tạo ra lỗi dưới đây được hiển thị trong hình ảnh:

nhập mô tả hình ảnh ở đây

Sau khi tìm kiếm một lúc, tôi đã tìm thấy blog này giải thích sự cố trong phần "Thuộc tính ngữ cảnh" mà tôi không thể hiểu chính xác có thể nó cung cấp cho bạn một số ý kiến ​​hay rằng điều gì đang xảy ra không đúng. về cơ bản khi chúng tôi đặt biến riêng tư, chúng tôi nhận được "LỖI: Thuộc tính là riêng tư và chỉ có thể truy cập trong lớp" . Tôi không hiểu tại sao nó lại đến.

Vui lòng giúp đỡ chúng tôi khi chúng tôi đang lao đầu vào vấn đề này trong vài ngày qua.


1
bạn đã cố gắng thay đổi thuộc tính từ tư nhân thành công cộng chưa?
Xin Meng

bạn có thể vui lòng chia sẻ nội dung tệp ts đang bị lỗi không?
Rajkishor Sahu,

Câu trả lời:


137

Đối với một thành phần nhất định, tất cả các thành viên của nó (phương thức, thuộc tính) được truy cập bởi khuôn mẫu của nó phải được công khai trong kịch bản biên dịch AOT. Điều này là do thực tế là một khuôn mẫu được chuyển thành một lớp TS. Một lớp đã tạo và một thành phần hiện là 2 lớp riêng biệt và bạn không thể truy cập vào các thành viên riêng tư giữa các lớp.

Tóm lại: bạn không thể truy cập các thành viên riêng tư trong các mẫu của mình nếu bạn muốn sử dụng tính năng biên dịch trước thời hạn.

Để giải thích rõ hơn https://github.com/angular/angular/issues/11422


nhưng đây không phải là trường hợp của các phiên bản Angular trước đó, phải không? tôi đã bắt đầu gặp những lỗi đó sau khi nâng cấp lên phiên bản mới nhất.
batmaci

35

Có thể một câu trả lời khác thậm chí còn đơn giản hơn là:

Các bạn, vui lòng không gọi các phương thức, trường hoặc thuộc tính riêng tư từ HTML :)


PS khi biên dịch *.tsmã thành *.js, KHÔNG THỂ từ chối kết nối các thành viên không công khai với mẫu HTML .

Và "có" điều này sẽ làm cho đường ống xây dựng của bạn bị lỗi: D


1
Hoặc truy cập các trường / thuộc tính riêng tư!
JMK

@Arsen Khachaturyan Thật buồn cười)
voodoo417

@JMK Tôi đã cập nhật bài viết theo gợi ý của bạn, cảm ơn bạn.
Arsen Khachaturyan

@ voodoo417, hài hước và đúng sự thật;). Đôi khi câu trả lời quá hàn lâm có thể thực sự thổi bay tâm trí của bất kỳ ai, và chúng ta chỉ cần đơn giản nhất có thể.
Arsen Khachaturyan

1
@Arsen Khachaturyan Đồng ý, Arsen +++
voodoo417

16

Vì vậy, tôi đã khắc phục sự cố này, tôi sẽ giữ điều này ngắn gọn và đơn giản. Để khắc phục điều này, tôi đã đọc blog này một cách sâu sắc. Như trong phần " Thuộc tính ngữ cảnh " Giải pháp cho vấn đề này là Không sử dụng hoặc tạo biến riêng nếu bạn muốn sử dụng nó trong chế độ xem trực tiếp khi bạn đang tạo bản dựng của mình với AOT ( tức là Trước thời gian ) cho sản xuất.

*ví dụ *

// 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;
    }
  }
}

đầu ra: Thuộc tính '_initials' là riêng tư và chỉ có thể truy cập trong lớp 'ThirdPartyComponent'.

Giải pháp:

cập nhật cái này private _initials: string;để đơn giản_initials: string;

Đối với câu trả lời này, Harish Gadiya cung cấp cho tôi một số trợ giúp để cảm ơn.


không cần phải sử dụng _nameđó, nó có thể được giống như bạn sử dụng this.và các namebiến cục bộ của nóthis.name=name;
LazerBanana

@LazerBanana, Nhưng this.name=nametrong set namelà inf. đệ quy
vp_arth

@vp_arth? một là địa phương một là toàn cầu? ngay cả với cùng một tên 2 thứ khác nhau, tôi đoán? thats tại sao u sử dụng this.để trỏ đến một thế giới
LazerBanana

Bạn có nghĩa là gì theo địa phương / toàn cầu? namekhông phải là biến, nó là thuộc tính đối tượng. this.name = namesẽ kích hoạt setter ( set name(v){}) trên đối tượng đó. Vì vậy, dễ dàng để kiểm tra nó: blitz Maximum call stack size exceeded
vp_arth

16

Tôi nhận được điều này khi tôi khai báo các tệp tin private trong hàm tạo:

constructor(private service: SpecificObjectService) { }

Và sử dụng chúng trong mẫu:

*ngFor="let pd of service.listSpecificObject "

Giải pháp là:

constructor(public service: SpecificObjectService) { }

6

Điều này phù hợp với tôi các bạn: Đơn giản chỉ cần thay đổi dịch vụ thành công khai.

constructor(public service: SpecificObjectService) { }

Ứng dụng đang được sản xuất !!


Vì vậy, giải pháp chính xác tương tự với câu trả lời ít chi tiết hơn như câu trả lời của @ TiyebM ở trên.
Ash

0

Được rồi, đây thực sự là một vấn đề javascript es6 đơn giản, nếu bạn phải giữ kiểu dữ liệu ở chế độ riêng tư, bạn có thể chỉ cần làm điều này

privateAccess(){
     return this.cannotAccessByInstanceButStillNeeded
}

0

Nếu bạn muốn sử dụng bộ định tuyến trong chế độ xem, vui lòng đặt nó ở chế độ công khai.

Ví dụ:

<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
) {}

Tôi đã bỏ qua nó cho đến khi Github CI gửi cho tôi một thư cảnh báo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.