2013-02-11 21 views
7

[इस नए 1.0.0-pre.4 + रूटर के बारे में है।]एंबर रूटर: अतुल्यकालिक मॉडल (वादों?)

मैं एक एंबर मार्ग के model विधि से एक रिकॉर्ड करने के लिए अतुल्यकालिक कॉलबैक की जरूरत है कि वापस करना चाहते लोड, उदाहरण के लिए, क्योंकि यह आवश्यक है कि हम एकाधिक (नेस्टेड) ​​मॉडल लोड करें। ऐसा करने का सबसे अच्छा तरीका क्या है?

App.Router.map -> 
    @resource 'filteredArticles', path: '/:filter' 

App.FilteredArticlesRoute = Ember.Route.extend 
    model: (params) -> 
    blog = App.Blog.find(1) # get the user's Blog singleton 
    property = switch params.filter 
     when 'published' then 'publishedArticles' 
     when 'draft' then 'drafts' 
     when 'all' then 'articles' 
    # Return the list of articles from the `blog` record. 
    # But `blog` hasn't necessarily finished loading :(
    blog.get(property) 
+0

जहां तक ​​मैं जानता हूँ कि अगर आप सिर्फ वापसी 'blog.get (संपत्ति) ले जा सकते हैं' यह एक और वादा वापस कर देगा, जो async लाया जाएगा। –

+0

मेरी इच्छा है कि यह किया गया है, लेकिन यह केवल एक खाली सरणी देता है जो कभी अपडेट नहीं होता है - भले ही 'App.Blog.find (1) .get (' articles ') को फिर से चलाया जा रहा हो, एक गैर-खाली सरणी उत्पन्न करता है। –

+0

मुझे लगता है कि मुझे एक गिथब मुद्दे की तरह अधिक लगता है :) –

उत्तर

4

मैं नवीनतम संस्करण के लिए एंबर Travis CI पुनर्लेखन के बीच में हूँ और मैं एक ही समस्या का सामना करना पड़ा है - हम स्लग द्वारा खजाने लाने (उदाहरण के लिए emberjs/ember.js), जो प्राथमिक कुंजी नहीं है। मेरे समाधान में Ember.ProxyObject का उपयोग करना शामिल है।

{ owner: 'emberjs', name: 'ember.js` } 

और इस प्रकार स्लग emberjs/ember.js बराबर होगा:

किसी /emberjs/ember.js की तरह पथ प्रवेश करती है, पैरामीटर की तरह दिखाई देगा।

प्रॉक्सी = Ember.ObjectProxy:

content = Ember.Object.create slug: slug, isLoaded: false 

तो मैं सामग्री के रूप में इस उद्देश्य के साथ एक प्रॉक्सी बनाने के लिए:

इस तरह की जानकारी के साथ, मैं सरल एंबर वस्तु है, जो सिर्फ slug और isLoaded गुण रखता है बनाने .create (सामग्री: सामग्री)

अब मैं स्लग का उपयोग कर सर्वर से रिकॉर्ड लोड कर सकता हूं और प्रॉक्सी को मॉडल के रूप में वापस कर सकता हूं। जब मुझे सर्वर से रिकॉर्ड मिलता है, तो मैं बस वास्तविक रिकॉर्ड में प्रॉक्सी सामग्री सेट करता हूं।

पूर्ण समाधान यहाँ है:

deserialize: (params) -> 
    slug = "#{params.owner}/#{params.name}" 
    content = Ember.Object.create slug: slug, isLoaded: false 
    proxy = Ember.ObjectProxy.create(content: content) 

    repos = Travis.Repo.bySlug(slug) 

    observer = -> 
    if repos.get 'isLoaded' 
     repos.removeObserver 'isLoaded', observer 
     proxy.set 'content', repos.objectAt(0) 

    if repos.length 
    proxy.set('content', repos[0]) 
    else 
    repos.addObserver 'isLoaded', observer 

    proxy 

तुम भी एक नज़र कोड के बाकी पर on github

0

कैसे के बारे में आप मॉडल अपने आप में एक पर्यवेक्षक जोड़ने के लिए, मॉडल की isLoaded स्थिति के बारे में और उसके बाद blog.get(property) फोन:


यहाँ है कि समस्या को दिखाता है एक काल्पनिक ब्लॉग app से नमूना कोड है

blogReady: function() { 
    if(this.get('isLoaded') { 
    // switch logic 
    } 
}.observes('isLoaded') 

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

  • कोई संबंधित समस्या नहीं^_^