2012-09-17 23 views
7

Trong một ứng dụng Ember, nói rằng bạn có một người quan sát hay một tài sản mà đồng hồ một mảng, như vậy:Ember.js: Việc thu gọn/trì hoãn quan sát đắt tiền hoặc tài sản tính

topContributor: (function() { 
    // ... loop over articles (hence slow) ... 
}).property('[email protected]') 

Cập nhật mảng articles, thông qua ember -data chẳng hạn, liên tục kích hoạt hàm thuộc tính với tổng số là articles.length lần.

Có cách nào để thu gọn các cập nhật thành một bản cập nhật lười biếng khi tất cả các thay đổi đã hoàn thành và runloop bị xóa không?

Trả lời

10

Nhờ @wagenet và @krisselden cho các con trỏ sau:

Tại thời điểm này, trong khi các ràng buộc được hoãn lại (lười biếng), quan sát và theo các thuộc tính mở rộng tính kích hoạt ngay lập tức. Trong tương lai, họ might become deferred as well.

Trong thời gian chờ đợi, bạn có thể sử dụng Ember.run.once làm giải pháp để lên lịch cuộc gọi chức năng bị trì hoãn, cuộc gọi này sẽ chỉ chạy một lần. Thuộc tính tính toán, tôi cho rằng, có thể dễ dàng biến thành người quan sát để theo cùng một mẫu. Dưới đây là ví dụ:

updateTopContributor: function() { 
    // ... loop over articles (hence slow) ... 
    this.set('topContributor', ...); 
}, 

_updateTopContributorObserver: (function() { 
    Ember.run.once(this, 'updateTopContributor'); 
}).observes('[email protected]') 
+0

'updateTopContributor' sẽ được gọi một lần bằng runloop, nhưng những gì tôi không hiểu, là cách nó khớp với kết thúc thay đổi? Tôi cho rằng cập nhật mảng 'articles' mất nhiều hơn một quyền hạn của runloop? do đó, 'updateTopContributor' sẽ được gọi nhiều lần ... Tôi có thể bỏ lỡ một cái gì đó ở đây, nhưng tôi thực sự hiểu được dòng chảy ở đây. Bạn có thể giải thích cho tôi? –

+0

Sự kết thúc của runloop xảy ra khi xử lý sự kiện được thực hiện. Vì vậy, nếu một phản ứng Ajax xuất hiện trong kho dữ liệu, thì nó sẽ cập nhật-cập nhật-cập nhật (kích hoạt người quan sát liên tục), và cuối cùng, trước khi trở về trình duyệt, nó sẽ xóa bỏ vòng lặp. Về mặt khái niệm, tất cả điều này tương tự như trì hoãn một cuộc gọi với 'setTimeout (..., 1)'. Bạn có thể tìm thêm thông tin trong [Tham chiếu Ember.run] (http://emberjs.com/api/classes/Ember.run.html) và [bài đăng trên blog này] (http://www.thesoftwaresimpleton.com/blog/2012/04/03/testing-ember-and-the-runloop /). –

+0

Ok, vì vậy nếu tôi hiểu, luồng là runLoop1 bắt đầu -> ajax response -> schedule updateTopContributor -> end ajax response -> runLoop1 end -> runLoop1 flushed -> runLoop2 bắt đầu -> updateTopContributor kích hoạt -> runLoop2 kết thúc. Runloop đầu tiên đang chạy trong khi cuộc gọi ajax chưa quay trở lại? –

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