2013-06-22 7 views
6

मैं एक संपूर्ण संग्रह लोड करना चाहता हूं और फिर एक बार में मॉडल के रूप में उपयोग करने के लिए रिकॉर्ड्स को छीलने के लिए, प्रत्येक बार सर्वर पर राउंडट्रिप किए बिना ।Model.find()। तब() रिकॉर्ड से पहले आग लगती है

मुझे पता चला है कि एम्बर का उपयोग कैसे करें। एक वादा वापस करने के लिए निर्धारित, लेकिन मुझे सही समय पर हल करने का वादा नहीं मिल सकता है। निम्नलिखित कोड सिर्फ आउटपुट "मिला 0" कभी समय: अगर मैं तो() के शरीर में लपेट एक setTimeout में है, और यह कुछ सेकंड इंतजार कर

App.PersonRoute = Ember.Route.extend({ 
    model: function(params) { 
    var name = "Erik"; 
    var promise = Ember.Deferred.create(); 
    App.people = App.Person.find(); 

    App.people.then(function() { 
     console.log('Found ' + App.people.get('length')); 
     var person = App.people.findProperty('name', name) 
     promise.resolve(person); 
    }); 

    return promise; 
    } 
}); 

, सब कुछ अच्छा काम करता है।

क्या कोई और घटना है जिसे मैं किसी भी तरह से बांध सकता हूं? मैंने App.people.on ('isLoaded') की कोशिश की, लेकिन isLoaded हमेशा सच है।

धन्यवाद!

उत्तर

6

क्या कोई और घटना है जिसे मैं किसी भी तरह से बांध सकता हूं?

वास्तव में एक ऐसी घटना है जिसे आप सुन सकते हैं और यह didLoad है।

मैंने App.people.on ('isLoaded') की कोशिश की, लेकिन isLoaded हमेशा सत्य है।

isLoaded के लिए वहाँ के रूप में इस के बारे में भ्रम का एक बहुत था, उदाहरण के लिए here देखते हैं, भ्रम की स्थिति तथ्य यह है कि isLoaded झंडा डिजाइन से सच पर सेट होता दुकान लोड हो रहा है RecordArray के लिए समाप्त हो गया है से आता है रिकॉर्ड, प्रारंभिक रूप से खाली क्योंकि स्थानीय रूप से कोई रिकॉर्ड पहले ही उपलब्ध नहीं था। फिर जब सर्वर का अनुरोध वापस आता है RecordArray बैकएंड से प्राप्त रिकॉर्ड्स के साथ पॉप्युलेट किया जाएगा, और बाइंडिंग बंद हो जाएंगी और आपके टेम्पलेट अपडेट हो जाएंगे।

रूप guides में कहा गया है:

एक रिकॉर्ड है कि दोनों भरी हुई और साफ मतलब यह है कि उसके गुण और सर्वर से रिश्ते, और कोई परिवर्तन के बारे में जानकारी प्राप्त की है ग्राहक पर स्थानीय रूप से बनाया गया है।

ऊपर वर्णित किया गया था didLoad आग बनाता है।

अधिक मॉडल से संबंधित घटनाओं के लिए

क्या आप कुछ इस तरह करने के लिए अपने कोड को फिर से लिखने सकता है, model lifecycle

अब आप अपने सेटअप करने के लिए नीचे गाइड पर एक नजर है सुन सकते हैं:

App.PersonRoute = Ember.Route.extend({ 
    model: function(params) { 
    var name = "Erik"; 
    var promise = Ember.Deferred.create(); 
    App.people = App.Person.find(); 

    App.people.on('didLoad', function() { 
     console.log('Found ' + App.people.get('length')); 
     var person = App.people.findProperty('name', name) 
     promise.resolve(person); 
    }); 

    return promise; 
    } 
}); 

आशा है कि यह मदद करता है ।

2

यदि वादा सही समय पर हल नहीं हो रहा है, तो मुझे लगता है कि यह एम्बर/डेटा में एक (काफी प्रमुख) बग होगा। मैं एम्बरज/डेटा के साथ एक बग भरने का सुझाव दूंगा।

मुझे संदेह है कि अलग-अलग वादे का उपयोग इस बग का कारण बन सकता है।

App.Person.find पहले से ही एक वादा वापस कर रहा है।model() से लौटने पर आपको उस वादे का उपयोग करना चाहिए। यह वादा करने के लिए आप केवल एक परिणाम वापस कर सकते हैं।

आपके द्वारा उपयोग किए जाने वाले Promises के लिए कार्यान्वयन शैली आम तौर पर आवश्यक होती है जब आप कुछ बाह्य एसिंक एपीआई को एकीकृत कर रहे हैं जो Promises का समर्थन नहीं करता है।

मैं आपके model() को फिर से प्रतिक्रिया दूंगा। यह आपके एसिंक टाइमिंग समस्या को ठीक कर सकता है।

App.PersonRoute = Ember.Route.extend({ 
    model: function(params) { 
    var name = "Erik"; 
    var promise = App.Person.find(); 

    promise.then(function() { 
     console.log('Found ' + App.people.get('length')); 
     return App.people.findProperty('name', name) 
    }); 

    return promise; 
    } 
}); 

मैं Q library पर डॉक्स पाया है कि जब सबसे अच्छा तरीका है वादों का उपयोग करने के पता लगाना बहुत उपयोगी हो सकते हैं। एम्बर आरएसवीपी का उपयोग करता है जो एक अलग पुस्तकालय है लेकिन सिद्धांत समान हैं।

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