2013-07-07 10 views
8

में पैरेंट रूट मॉडल तक पहुंचने में मैं एक मार्ग लिखने की कोशिश कर रहा हूं जिसके लिए अपने माता-पिता के मॉडल तक पहुंच की आवश्यकता है। मैं this.modelFor() का उपयोग करता हूं, लेकिन जब मैं ऐसा करता हूं, तो माता-पिता का मॉडल पूरी तरह से लोड नहीं होता है, इसलिए इसकी सभी गुणों में null शामिल है।Ember.js

MGames.Router.map(function() { 
    this.resource('games', function() { 
     this.resource ('game', {path: '/:game_id'}, function() { 
      this.resource('board', {path: '/boards/:board_id'}); 
     }); 
    }); 
}); 

यह मेरा GameRoute, जो पूरी तरह से काम करता है::

MGames.GameRoute = Ember.Route.extend ({ 
    model: function (params) { 
     return MGames.Game.find(params.game_id); 
    } 
}); 

और अंत में इस बच्चे मार्ग, जो करने के लिए उपयोग की जरूरत है

इस रूटर, दो गतिशील घटकों के साथ है गेम मॉडल, और यही वह है जो मैंने लिखा था। लेकिन कोई फर्क नहीं पड़ता कि मैं क्या करता हूं, console.log() हमेशा null प्रिंट करता है। अगर मैं game चर की जाँच करें, isLoad संपत्ति हमेशा रिक्त है:

MGames.BoardRoute = Ember.Route.extend ({ 
    model: function (params) { 
     var game = this.modelFor ('game'); 
     console.log (game.get("id")); 
     return MGames.Board.find(game.get("id"), params.board_id); 
    } 
}); 

Am मैं कुछ गलत कर, या (के रूप में मुझे लगता है) मैं कुछ एंबर अवधारणा याद कर रहा हूँ?

उत्तर

6

आपके कोड का यह हिस्सा अच्छा दिखता है। आपकी धारणाएं उसमें सही हैं, नेस्टेड मार्ग को माता-पिता का मॉडल modelFor के माध्यम से प्राप्त करना चाहिए।

मुझे संदेह है कि आपकी खोज विधि बग का स्रोत है। मैंने आपके previous question को देखा, और मुझे लगता है कि एक ही Game.find का उपयोग किया जाता है (?)

समस्या Promises के साथ करना है। एम्बर राउटर model हुक की एसिंक प्रकृति को समझता है। लेकिन यह आपके काम करने के लिए Promise लौटने पर निर्भर करता है। वर्तमान में आप jQuery वादे का उपयोग कर रहे हैं लेकिन game ऑब्जेक्ट को तुरंत इसके प्रारंभिक स्थिति में वापस कर रहे हैं। क्वेरी सर्वर से लोड होती है लेकिन model() हुक ऐसा होने से पहले हल हो गया माना जाता है।

आप सीधे model हुक से jQuery Promise वापस लौटना चाहते हैं + पहले then में पार्सिंग करें और परिणाम के रूप में इसे वापस करें।

यहां आपके संशोधित Game.find है। वही सिद्धांत अन्य खोजकर्ताओं पर लागू होते हैं।

find: function (game, board) { 
    url = [MGames.GAMES_API_URL]; 
    url.push ('games'); 
    url.push (game); 
    url.push ('boards'); 
    url.push (board); 
    url = url.join('/'); 

    return $.getJSON(url) 
    .then(function(response) { 
     var game = MGames.Game.create({isLoaded: false}); 
     game.setProperties(response); 
     game.set('isLoaded', true); 

     return game; 
    }); 
} 

ध्यान दें कि, गेम ऑब्जेक्ट को वापस लौटा दिया गया है। एम्बर समझता है कि जब वादा हल हो जाता है (एक वादे के अलावा कुछ भी लौटकर), तो परिणाम model() हुक के लिए मॉडल है। यह game ऑब्जेक्ट वह मॉडल है जो अब घोंसला वाले मार्ग में modelFor में उपलब्ध होगा।

+0

यह वास्तव में समस्या थी। मजाकिया हिस्सा यह है कि मैंने कल आपके संशोधन की कोशिश की, लेकिन, भगवान जानता है कि क्यों, मैंने केवल बोर्ड की खोज विधि बदल दी और गेम को बिना छेड़छाड़ और गलत छोड़ दिया। मुझे चालाक वैसे, मैं आपको एक और +1 दूंगा यदि मैं अपने पिछले प्रश्न को देखने और उत्तर को पूरा करने के लिए इसका उपयोग करने में परेशानी लेने के लिए कर सकता हूं। आपको बहुत - बहुत धन्यवाद! –

+0

वह कोड बहुत परिचित लग रहा था। :) –