2012-05-13 35 views
6

Trong một phương thức trên lớp con Ember.View, tôi chỉ muốn thay đổi DOM nếu phần tử chế độ xem đã được chèn vào DOM. Làm thế nào tôi có thể kiểm tra điều đó?Ember.js: Kiểm tra xem phần tử xem có được chèn vào DOM

Tôi biết tôi có thể tạo ra một tài sản phụ như vậy:

didInsertElement: function() { 
    this.set('elementIsInserted', true); 
} 
willDestroyElement: function() { 
    this.set('elementIsInserted', false); 
} 

Nhưng có một số kinh điển, được xây dựng theo cách?

Tôi không tìm thấy bất cứ điều gì lướt qua view.js, nhưng có lẽ tôi đang thiếu một cái gì đó.

Trả lời

9

Nếu bạn muốn tránh phải thiết lập một lá cờ phụ trợ, bạn có thể mở rộng Ember.View:

Ember.View.reopen({ 
    didInsertElement: function() { 
     this.set('elementIsInserted', true); 
     this._super(); 
    }, 

    willDestroyElement: function() { 
     this.set('elementIsInserted', false); 
     this._super(); 
    } 
}); 

Bây giờ mỗi Xem mà kéo dài Ember.View sẽ nhận được ở trên.

Ngoài ra, một thành viên của nhóm nòng cốt đề nghị bạn tránh đề cập đến inDOM vì nó là biến nội bộ và không được dùng để sử dụng trong mã.

+0

Cảm ơn! Một bất lợi có vẻ là bây giờ bạn phải gọi 'this._super()' bất cứ khi nào bạn khai báo didInsertElement của riêng bạn trong các lớp con của Ember.View. –

+0

Đây chính xác là những gì tôi cần nhờ câu trả lời ngắn gọn. – Nomad101

+0

Vậy làm thế nào để bạn truy cập từ bên trong bộ điều khiển của bạn? Giả sử tôi có một số mã trong bộ điều khiển mà tôi chỉ muốn chạy khi khung nhìn đã được chèn vào nhưng tôi không muốn mã đó bên trong didInsertElement. Tôi sẽ kiểm tra cờ này và đặt một .observes() trên phương pháp để làm gì? Cảm ơn! – bfcoder

13

Mỗi chế độ xem có thuộc tính _state, được đặt thành "inDOM" khi phần tử được chèn vào.

if (this._state=="inDOM") doStuff(); 

sẽ hoạt động. Đảm bảo bạn có đúng this!

+0

Tôi đã đánh dấu câu trả lời của Zack là được chấp nhận vì tôi nghĩ nó đúng hơn, nhưng tôi thực sự làm điều này trong ứng dụng của riêng tôi vì nó dễ dàng hơn. Tôi đóng gói nó trong một tài sản để nó có thể dễ dàng thay đổi: https://gist.github.com/246bbf7305e09ed7ce80 –

+0

Thuộc tính 'state' được đổi tên thành' _state' trong Ember 1.6 và dạng cũ đã được đánh dấu là không được chấp nhận trong 1.8. – Gil

+0

@Gil cảm ơn. Tôi sẽ chỉnh sửa câu trả lời. – weltraumpirat

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