2012-09-17 8 views
7

एक एंबर ऐप्लिकेशन में टाल, आप एक पर्यवेक्षक या एक संपत्ति है कि एक सरणी, इसलिए की तरह देखता है कहना उदाहरण के लिए डेटा, बार-बार articles.length बार के लिए संपत्ति फ़ंक्शन को ट्रिगर करता है।Ember.js: एंबर के माध्यम से</p> <pre><code>topContributor: (function() { // ... loop over articles (hence slow) ... }).property('[email protected]') </code></pre> <p><code>articles</code> सरणी अपडेट कर रहा है,: गिर/महंगा पर्यवेक्षकों या अभिकलन गुण

क्या सभी परिवर्तन समाप्त हो गए हैं और रनलोप फ़्लश होने पर अपडेट को एक आलसी अपडेट में पतन करने का कोई तरीका है? निम्नलिखित संकेत के लिए @wagenet और @krisselden को

उत्तर

10

धन्यवाद:

फिलहाल, जबकि बाइंडिंग आस्थगित कर रहे हैं (आलसी), पर्यवेक्षकों और विस्तार अभिकलन गुण द्वारा तुरंत ट्रिगर। भविष्य में, वे might become deferred as well

इस बीच, आप एक स्थगित फ़ंक्शन कॉल शेड्यूल करने के लिए एक कार्यवाही के रूप में Ember.run.once का उपयोग कर सकते हैं, जो केवल एक बार चलाया जाएगा। गणना की गई गुण, मुझे लगता है, आसानी से एक ही पैटर्न का पालन करने के लिए पर्यवेक्षकों में बदल दिया जा सकता है।

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

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

'updateTopContributor' runloop द्वारा एक बार बुलाया जाएगा, लेकिन मुझे समझ नहीं आता क्या है, यह कैसे परिवर्तन के अंत से मेल खाता है: यहाँ एक उदाहरण है? मुझे लगता है कि 'लेख' सरणी अद्यतन एक से अधिक रनलोप सही लेता है? तो 'updateTopContributor' को कई बार बुलाया जाएगा ... मुझे शायद कुछ याद आती है, लेकिन मैं वास्तव में यहां प्रवाह को समझूंगा। क्या आप मुझे समझा सकते हैं? –

+0

रनलोप का अंत होता है जब ईवेंट हैंडलिंग किया जाता है। तो यदि डेटा स्टोर के लिए एक अजाक्स प्रतिक्रिया आती है, तो यह अपडेट-अपडेट-अपडेट (पर्यवेक्षक को बार-बार ट्रिगर करना) चला जाता है, और अंत में, ब्राउज़र पर लौटने से पहले, यह रनलोप को फ्लश करेगा। संकल्पनात्मक रूप से, यह सब 'setTimeout (..., 1)' के साथ एक कॉल को परिभाषित करने के समान है। आपको [Ember.run संदर्भ] में अधिक जानकारी मिल सकती है (http://emberjs.com/api/classes/Ember.run.html) और [यह ब्लॉग पोस्ट] (http://www.thesoftwaresimpleton.com/blog/2012/04/03/परीक्षण-एंबर और-runloop /)। –

+0

ठीक है, यदि ऐसा है तो मैं समझता हूँ, प्रवाह है runLoop1 शुरू होता है -> ajax प्रतिक्रिया -> अनुसूची updateTopContributor -> ajax प्रतिक्रिया के अंत -> runLoop1 अंत -> runLoop1 प्लावित -> runLoop2 शुरू होता है -> updateTopContributor शुरू हो रहा -> runLoop2 समाप्त होता है। पहला रनलोप चल रहा है जबकि AJAX कॉल वापस नहीं आया है? –

संबंधित मुद्दे