Sự khác biệt giữa phương thức sản xuất và phát triển trong Angular2 là gì?


Câu trả lời:


76

Trong chế độ phát triển, phát hiện thay đổi thực hiện lần thứ hai ngay sau lần chạy đầu tiên và tạo ra lỗi nếu bất kỳ giá trị ràng buộc nào đã thay đổi giữa lần chạy thứ nhất và lần thứ hai. Điều này giúp xác định lỗi khi kiểm tra các giá trị có tác dụng phụ hoặc các trường hoặc hàm không trả về cùng một giá trị trong các lần gọi tiếp theo, điều này làm suy yếu khả năng phát hiện thay đổi của Angular.

Trong chế độ phát triển, trong lần chạy phát hiện thay đổi thứ hai, Angular cũng thực hiện một số so sánh đối tượng sâu mà nó sẽ không thực hiện trong quá trình sản xuất để phát hiện những thay đổi mô hình không được phép.

Cập nhật:

Trong chế độ phát triển, một gợi ý cũng được in ra bảng điều khiển khi dịch vụ trình vệ sinh HTML tách các giá trị khỏi các liên kết [innerHTML]="..."hoặc [ngStyle]="...". Xem thêm: Trong RC.1 một số kiểu không thể được thêm bằng cú pháp ràng buộc


5
Làm cách nào để phát hiện xem tôi đang chạy ở chế độ sản xuất hay chế độ phát triển?

Tôi đã thấy điều này được hỏi rồi nhưng tôi chưa thấy câu trả lời. Bạn cần bật chế độ sản xuất một cách rõ ràng và bạn cũng có thể đặt một số biến toàn cục khi bật Mã sản phẩm có thể được kiểm tra trong mã của bạn để biết chế độ nào đang hoạt động.
Günter Zöchbauer

6
Ngoài ra, nếu bạn đang chạy ở chế độ nhà phát triển và mở bảng điều khiển trong trình duyệt của mình, nó sẽ có một thông báo được in cho biết "Angular 2 đang chạy ở chế độ phát triển. Gọi enableProdeMode () để kích hoạt chế độ sản xuất." Nếu bạn đã ở chế độ sản xuất, bạn sẽ không thấy gì ở đây.
c.dunlap

36

Tài liệu cho trạng thái ApplicationRef.tick () :

Trong chế độ phát triển, tick()cũng thực hiện chu kỳ phát hiện thay đổi thứ hai (TTL = 2) để đảm bảo rằng không có thay đổi nào được phát hiện. Nếu các thay đổi bổ sung được chọn trong chu kỳ thứ hai này, các ràng buộc trong ứng dụng có tác dụng phụ không thể giải quyết trong một lần phát hiện thay đổi. Trong trường hợp này, Angular đưa ra một lỗi, vì một ứng dụng Angular chỉ có thể có một lần vượt qua phát hiện thay đổi trong đó tất cả phát hiện thay đổi phải hoàn thành.

Lý do mà chúng tôi không thể có các thay đổi bổ sung là vì trong chế độ sản xuất, tính năng phát hiện thay đổi chỉ chạy một lần, có nghĩa là mọi thành phần trong cây thành phần được kiểm tra một lần (TTL = 1) ... từ trên cùng, theo chiều sâu đặt hàng. Vì vậy, nếu thay đổi đối với thuộc tính đầu vào của thành phần con gây ra thay đổi đối với một số thuộc tính khác mà thành phần mẹ đã ràng buộc trong một dạng xem / mẫu, dạng xem của thành phần mẹ sẽ không được cập nhật (vì phát hiện thay đổi sẽ không truy cập lại thành phần cha trong chế độ sản xuất ... vì chuyển tải cây "một lần"). Nó sẽ chỉ được cập nhật vào lần tới khi một số sự kiện xảy ra và tính năng phát hiện thay đổi chạy lại - nhưng đã quá muộn!

Đây là một Plunker vi phạm quy tắc - một thành phần con cóset phương thức trên một thuộc tính đầu vào để sửa đổi một thuộc tính đầu vào khác. Có, đây là một ví dụ giả, nhưng nó dễ hiểu hơn ví dụ tiếp theo:

Một tình huống khác mà bạn có thể gặp phải sự cố này là với các đường ống trạng thái. Kiểm tra câu trả lời này nếu đó là vấn đề của bạn.

Bạn nên mô tả vấn đề của mình (trong một câu hỏi SO khác). Cần phải có một cách để sửa chữa nó.

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.