2016-05-22 24 views
15

Trong Angular 1 tất cả các thao tác DOM nên được thực hiện trong các chỉ thị để đảm bảo kiểm tra thích hợp, nhưng những gì về Angular 2? Điều này đã thay đổi như thế nào?Thao tác DOM ở đâu trong Góc 2?

Tôi đã tìm kiếm các bài viết hay bất kỳ thông tin nào về vị trí đặt thao tác DOM và cách suy nghĩ khi thực hiện nó, nhưng mỗi lần tôi lại trống rỗng.

Hãy thành phần này ví dụ (điều này thực sự là một chỉ thị nhưng chúng ta hãy giả vờ rằng nó không phải):

export class MyComponent { 

    constructor(private _elementRef: ElementRef) { 

    this.setHeight(); 

    window.addEventListener('resize', (e) => { 
     this.setHeight(); 
    }); 
    } 

    setHeight() { 
    this._elementRef.nativeElement.style.height = this.getHeight() + 'px'; 
    } 

    getHeight() { 
    return window.innerHeight; 
    } 
} 

Có ràng buộc sự kiện thuộc về một nhà xây dựng chẳng hạn, hoặc điều này nên được đặt trong ngAfterViewInit chức năng hay ở đâu khác? Nếu bạn cố gắng phá vỡ thao tác DOM của một thành phần thành một chỉ thị?

Tất cả chỉ là một hiện tượng mờ tại thời điểm này nên tôi không chắc chắn rằng tôi đang thực hiện chính xác và tôi chắc chắn rằng tôi không phải là người duy nhất.

Quy tắc cho thao tác DOM trong Angular2 là gì?

Trả lời

9

Thao tác DOM trực tiếp nên tránh hoàn toàn trong Angular2.

Sử dụng thay vì các ràng buộc như:

export class MyComponent { 
    constructor() { 
    this.setHeight(); 
    } 

    @HostBinding('style.height.px') 
    height:number; 

    @HostListener('window:resize', ['$event']) 
    setHeight() { 
    this.height = window.innerHeight; 
    } 
} 
+0

Bạn có thể xây dựng không? – Chrillewoodz

+0

'@HostListener (...)' đăng ký một trình lắng nghe sự kiện và '@HostBinding (...)' cập nhật giá trị kiểu 'chiều cao' thành giá trị được gán cho' số'. Trình xử lý sự kiện không chính xác. Tôi đã cập nhật câu trả lời của mình (xin lỗi, chỉ trên điện thoại khi tôi viết nó). –

+2

Thao tác DOM trực tiếp không tương thích với hiển thị phía máy chủ và sử dụng hỗ trợ Angulars WebWorkers. –

14

Dựa trên đề nghị giải pháp bởi nhà phát triển: http://angularjs.blogspot.de/2016/04/5-rookie-mistakes-to-avoid-with-angular.html

@Component({ 
    selector: 'my-comp', 
    template: ` 
    <div #myContainer> 
    </div> 
    ` 
}) 
export class MyComp implements AfterViewInit { 
    @ViewChild('myContainer') container: ElementRef; 

    constructor() {} 

    ngAfterViewInit() { 
    var container = this.container.nativeElement; 
    console.log(container.width); // or whatever 
    } 
} 

Attention: Tên xem đứa trẻ có để bắt đầu với Tên của tôi và trong mẫu bạn cần #.

+1

Đừng quên thêm các mục nhập phù hợp: nhập {AfterViewInit, ViewChild} từ '@ angular/core'; trích đoạn mã từ: https://angular.io/docs/ts/latest/cookbook/component-communication.html#!# parent-to-view-child –

+0

Bạn cũng cần bao gồm nhập {ElementRef} từ '@ góc/lõi'; –

+0

Bạn có nói rằng tiền tố * my * phải có trong tên không? Hoặc bạn đã có nghĩa là tên chúng tôi đề cập đến trong '@ViewChild ('bất cứ điều gì')' phải tương ứng với '# bất cứ điều gì' trong đánh dấu của mẫu? –

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