2016-09-07 11 views
19

Angular 2 rc 6, typescript 2, node 4.5.0, npm 2.15.9 trên Windows 7Góc 2 Trình biên dịch phía trước của thời gian: tôi có phải làm cho tất cả các thuộc tính lớp công khai không?

Tôi đang cố gắng để di chuyển từ Just-in-Time để Ahead-of-Time biên soạn và tôi dựa vào các nguồn lực:

tôi hiểu rằng tôi cần phải chạy trình biên dịch ngc để tạo các tệp ngfactory.ts và tôi cần thay đổi main.ts để sử dụng platformBrowser thay vì platformBrowserDynamic để khởi động. Tôi đã gặp phải rào cản và không biết cách tiếp tục.

1. Tôi đã xác nhận rằng Ứng dụng chạy không có lỗi khi sử dụng tính năng Soạn thảo trong thời gian thực. main.ts của tôi là:

enableProdMode(); 
platformBrowserDynamic().bootstrapModule(AppModule); 

2. để xóa tất cả các file ứng dụng của tôi từ thư mục sản xuất của tôi, nhưng giữ thư viện của bên thứ 3 (ví dụ: góc 2, góc 2 Material)

3. tôi chạy "node_modules/.bin/ngc" -p ./ Thao tác này không có đầu ra cho bảng điều khiển. Tôi thấy tệp .ngfactory.ts cho mỗi thành phần và mô-đun .ts của tôi. Tôi cũng thấy tệp .css.shim.ts cho mỗi số .css của tôi có kiểu dáng thành phần. Bên cạnh đó, .js.js.map file đã được transpiled và đặt trong thư mục sản

4. Nếu tôi cố gắng để chạy các ứng dụng vào thời điểm này, tôi thấy 404 not found lỗi cho tất cả các .html file mà tổ chức các mẫu thành phần

5. Tôi di chuyển tất cả các tệp mẫu theo cách thủ công (.html) sang thư mục sản xuất và chạy Ứng dụng. Nó chạy tốt, nhưng nó vẫn sử dụng Just-in-Time biên soạn (255 yêu cầu, bao gồm compiler.umd.js)

6. tôi thay đổi tôi main.ts tới:

enableProdMode(); 
platformBrowser().bootstrapModuleFactory(AppModuleNgFactory); 

On riêng của mình, điều này làm cho có sự khác biệt vì mã mới chưa được biên dịch. Tuy nhiên, tôi không biết phải làm gì từ đây.

Tôi có nên chạy lại ngc không? Nếu tôi nhận được rất nhiều lỗi thuộc loại:

Error at C:/path/to/notify.component.ngfactory.ts:113:41: Property 'visible' is private and only accessible within class 'NotifyComponent' 
... (many more like that with lots of properties from lots of components) 
Compilation failed 

Việc sử dụng trình biên dịch AoT có nghĩa là tôi phải công khai tất cả các thuộc tính lớp học của mình? Tôi có bỏ lỡ một bước không?

Trả lời

32

Đối với một thành phần nhất định, tất cả các thành viên (phương pháp, thuộc tính) truy cập theo mẫu của nó phải được công khai trong kịch bản biên dịch trước. Điều này là do thực tế là một mẫu được biến thành một lớp TS.Một lớp được tạo ra và một thành phần là 2 lớp riêng biệt bây giờ và bạn không thể truy cập các thành viên riêng tư chéo 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 quá trình biên dịch trước.

+4

Đó cũng là những gì tôi đã tìm. Muốn tài liệu ionic làm cho điều này rõ ràng hơn như là 'biến đổi biến riêng thành âm thanh công khai' loại đáng sợ – masimplo

4

Vì vậy, quá, trong phiên bản cuối cùng của góc 2 whit Ionic2 RC1

Có thể chỉnh lại Fields có thể được sử dụng thu khí mà không setters

protected _myField: any; 

get myField(): any { 
    return this._myField; 
} 

Bạn cũng có thể nhìn thấy JIT khác để cân nhắc AOT thích ứng với mã của bạn trong this blog of Isaac Mann

  1. const lambda => chức năng xuất khẩu
  2. xuất khẩu mặc định => đặt tên xuất khẩu
  3. tin, accessors bảo vệ nên được thay đổi ra công chúng cho bất kỳ thành viên truy cập từ mẫu
  4. mẫu thành phần năng động => mẫu tĩnh
  5. moduleId nên được đặt vào các thành phần với templateUrl
Các vấn đề liên quan