2017-07-17 11 views
8

Tôi có một lớp (giao diện) trong ứng dụng 4 góc của tôi có nhiều trường. Lưu ý rằng trường hợp của lớp/giao diện này là immutable (tức là các thành viên sẽ KHÔNG BAO GIỜ được thay đổi).Tác động hiệu suất của một lớp/giao diện với nhiều trường là gì?

Ví dụ:

public interface IHaveALotOfFields { 
    field1: string; 
    //... 
    field500: string; 
} 

Giao diện này được cung cấp qua dịch vụ (đơn đăng ký) được hiển thị với tư cách thành viên. Ví dụ.

@Injectable() 
public class MyService { 
    public translations: ITranslationsProvider; 
} 

Dịch vụ này được tiêm vào rất nhiều thành phần (gần như tất cả các thành phần) và thường được sử dụng trong mẫu tương ứng của họ và thường cũng trong ts -part của các thành phần. Ví dụ.

@Component({ 
       template: `Value: {{service.field500}}` 
      }) 
export class MyComponent { 
    public constructor(public service: MyService) { 
    } 

    private doSomething(): string { 
     return this.service.field1; 
    } 
} 

Bây giờ câu hỏi của tôi:

  • một lớp lớn (với rất nhiều lĩnh vực) sẽ làm cho góc chậm vì việc phát hiện sự thay đổi?
  • Có cách nào để đánh dấu một lớp là "Bỏ qua tôi khi phát hiện thay đổi" không? (một cái gì đó tương tự như ChangeDetectionStrategy.OnPush, nhưng thay vì chỉ định điều này cho mỗi thành phần, có thể được khai báo trên chính lớp đó hoặc trên thành viên của dịch vụ)

Xin lưu ý rằng tôi không muốn thay đổi phát hiện thay đổi chiến lược của tất cả các thành phần của tôi đến OnPush.

+0

Giao diện chỉ là một cách kiểm tra kiểu. Nó sẽ không được tiêm ... Chỉ các đối tượng được tiêm đã được khởi tạo bởi một lớp mới. Giao diện là một hợp đồng mà lớp sẽ tuân theo. Trong giao diện, bạn gán các thuộc tính và phương thức chữ ký cho hợp đồng ... Các dịch vụ có @Injectable và Angular sẽ xử lý sự khởi tạo của những cái để bạn tự động kết nối mọi thứ lại với nhau. – JGFMK

+0

Tôi biết. Tôi có các lớp cụ thể thực hiện giao diện này. 'MyService' về cơ bản nhận một thể hiện của một lớp thực hiện giao diện được tiêm. –

+0

Giao diện không được tiêm các đối tượng duy nhất .. Đây là những gì tôi hy vọng sẽ giúp bạn. tức là bạn không thể làm mới trên giao diện ... – JGFMK

Trả lời

4

Lớp học lớn (có nhiều trường) có làm chậm góc do phát hiện thay đổi không?

số phát hiện sự thay đổi góc thực hiện hai hoạt động mà đọc thuộc tính của lớp:

  • DOM cập nhật về các thành phần hiện tại
  • bindings đầu vào cập nhật của các thành phần con/chỉ thị

Đối với những hoạt động Trình biên dịch góc tạo hai chức năng:

  • updateRenderer - đọc các lĩnh vực được sử dụng trong các mẫu
  • updateDirectives - đọc các lĩnh vực quy định tại biểu thức ràng buộc đầu vào

Những chức năng chỉ đọc thuộc tính cụ thể từ các dịch vụ. Ví dụ bạn

Value: {{service.field500}}

các updateRenderer chức năng sẽ xem xét một cái gì đó dọc theo dòng:

function(_ck,_v) { 
    var _co = _v.component; 
    var currVal_0 = _co.service.field500; 
    _ck(_v,1,0,currVal_0); 

Các chức năng này được gọi là trên mỗi vòng lặp tiêu hóa. Nhưng như bạn có thể thấy chỉ tài sản có liên quan sẽ được đọc từ dịch vụ. Vì vậy, nó không quan trọng có bao nhiêu thuộc tính có trên dịch vụ.

Có cách nào để đánh dấu một lớp là "Bỏ qua tôi khi phát hiện thay đổi" không?

Tôi giả sử bạn đang hỏi về ràng buộc một lần như chúng tôi có trong AngularJS. Có lẽ nó sẽ được thêm vào trong Angular. Tôi sẽ theo dõi và cập nhật câu trả lời nếu có gì đó xuất hiện. Nhưng như bạn có thể biết bạn có thể tắt/bật phát hiện thay đổi cho thành phần bằng cách sử dụng cd.detach/cd.attach. Bạn có thể nghe một số tín hiệu từ dịch vụ và chạy đĩa CD theo cách thủ công khi được neeed.

Dưới đây là danh sách các bài viết bạn có thể đọc để hiểu được cơ chế phát hiện sự thay đổi tốt hơn:

+0

Cảm ơn câu trả lời tuyệt vời. Ý nghĩa của tôi với cách đánh dấu một lớp là "Bỏ qua tôi khi phát hiện thay đổi", nếu có một cách để nói với góc rằng các thuộc tính/trường của lớp cụ thể này là "hằng" (có giá trị không đổi) và sẽ không bao giờ thay đổi. Không có vấn đề nếu lớp học được tiêm từ một dịch vụ hoặc như là một đầu vào hoặc tuy nhiên khác. –

+0

@ OschtärEi, ah, tôi hiểu rồi. Không, thật không may là không có cách nào để làm điều đó. Trong AngularJS chúng tôi đã có một thời gian ràng buộc. Có lẽ nó sẽ được thêm vào trong Angular. Tôi sẽ theo dõi và cập nhật câu trả lời nếu có gì đó xuất hiện. Nhưng như bạn có thể biết bạn có thể vô hiệu hóa/bật phát hiện thay đổi cho thành phần bằng cách sử dụng 'cd.detach/cd.attach'. Bạn có thể nghe một số tín hiệu từ dịch vụ và chạy đĩa CD theo cách thủ công khi được neeed. –

+0

Cảm ơn bạn lần nữa. Nhưng nếu tôi sử dụng 'tách/đính kèm' tất cả các phát hiện thay đổi của thành phần sẽ được tách ra (những gì tôi không muốn) và tôi cũng sẽ cần phải làm điều này trong tất cả các thành phần của tôi (vì hầu như tất cả các thành phần sử dụng" lớp lớn "này –

Các vấn đề liên quan