2016-03-04 29 views
6

Cập nhật vào năm 2017: ViewChild sẽ là cách tốt nhất để truy cập phần tử Dom.Angular2 + Typescript: cách thao tác với phần tử DOM?

Câu hỏi được đăng trong năm 2016:

Tôi đã thử hai phương pháp sau đây, chỉ có phương pháp 2 hoạt động. Nhưng tôi không muốn mã lặp lại: document.getElementById() trong mỗi phương thức. Tôi thích phương pháp 1, nhưng tại sao phương pháp 1 không hoạt động?

Có cách nào tốt hơn để thao tác DOM trong Angular2 không?

.html file:

<video id="movie" width="480px" autoplay> 
    <source src="img/movie.mp4" type="video/mp4"> 
    Your browser does not support the video tag. 
</video> 

Phương pháp 1:

... 
class AppComponent { 
    videoElement = document.getElementById("movie"); 

    playVideo() { 
     this.videoElement.play(); 
    } 
} 

Cách 2:

... 
class AppComponent { 

    playVideo() { 
     var videoElement = document.getElementById("movie"); 
     videoElement.play(); 
    } 
} 
+0

những gì bạn muốn một sk? đăng một số mã hoặc plunkr nếu có thể. có vẻ như cả hai phương pháp bạn đăng tải đều giống nhau? –

+0

Tôi biết nó có vẻ giống nhau cho các biến, nhưng thực sự cho phần tử DOM, có sự khác biệt giữa việc khai báo một biến phần tử DOM bên trong phương thức và phương thức bên ngoài. Nó có vẻ rất lạ, nhưng tôi nhận được kết luận này sau khi phương pháp đầu tiên thất bại. –

+0

bạn có kết luận gì? có sự khác biệt lớn nào giữa hai loại này không? nếu có, câu trả lời có thể hữu ích cho người khác. –

Trả lời

9
<div #itemId>{{ (items()) }}</div> 

bạn có thể truy cập vào phần tử qua ViewChild:

import {ViewChild} from '@angular/core'; 

    @ViewChild('itemId') itemId; 

    ngAfterViewInit() { 
     console.log(this.itemId.nativeElement.value); 
    } 
0

Theo câu hỏi của bạn, bạn muốn sử dụng một số phần phổ biến của mã vào nhiều phương pháp. nhưng bạn đã không thành công. chỉ cần khai báo một biến duy nhất và gán một số giá trị để biến mà sau đó bạn sẽ có thể sử dụng biến đó vào nhiều phương pháp như thế này hay chúng ta có thể nói ràng buộc giá trị biến này với hai dữ liệu theo cách ràng buộc của góc bằng [(ngModel)]:

class A { 
     abc:string = null; 
     abc2:string = null; 

     abcFun(){ 
     console.log(this.abc) 
     } 

     bcdFun(){ 
     console.log(this.abc) 
     } 

     // second method using javascript as your way 
      abcFun2(){ 
      this.abc2 = document.getElementById('abc2').value; 
      console.log(this.abc2); 
      } 
      bcdFun2(){ 
      console.log(this.abc2); 
      } 
    } 

<input type="text" id="abc" [(ngModel)]="abc"> {{abc}} 

<button (click)="abcFun()">ABC FUN</button> 
<button (click)="bcdFun()">BCD FUN</button> 


<input type="text" id="abc2"> {{abc2}} 

<button (click)="abcFun2()">ABC FUN</button> 
<button (click)="bcdFun2()">BCD FUN</button> 

đây là bản demo làm việc cho cùng một http://plnkr.co/edit/Y80SsPCUTx1UP5tYksIy?p=preview

+0

Tôi đã thử mã của bạn ở trên, nó cũng không hoạt động. Bạn đã bao giờ thử nghiệm nó chưa? –

+0

xin vui lòng xem tại demo làm việc gắn liền với liên kết. bạn có thể sử dụng hai cách ràng buộc dữ liệu quá. –

+0

Cảm ơn sự giúp đỡ của bạn. Rất tiếc, tôi gặp sự cố khi tạo ứng dụng angular2 trên Plunker và không thể chỉnh sửa mã của bạn trên Plunker. Nhưng tôi đã cập nhật mã ở trên. Bạn hiểu lầm câu hỏi của tôi. Câu hỏi của tôi là tất cả về thao tác DOM thông qua document.getElementById(). Bởi vì tôi muốn chơi/tạm dừng video, tôi phải lấy phần tử. Vấn đề là nếu tôi định nghĩa biến videoElement bên ngoài các phương thức khác với phương thức được định nghĩa bên trong. Phương thức đầu tiên sẽ gặp lỗi, chúng ta không thể truy cập phần tử DOM khi nó được định nghĩa bên ngoài phương thức. Bạn có thể cấp cho tôi quyền chỉnh sửa plunker của bạn không? –

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