2013-07-07 13 views
8

Ebeveynin modeline erişmesi gereken bir yol yazmayı deniyorum. this.modelFor() kullanıyorum, ancak bunu yaptığımda, ebeveynin modeli tamamen yüklenmemiş, tüm özellikleri null içeriyor. Bu mükemmel çalışıyor benim GameRoute olduğuAna yol modeline Ember.js içinde erişme

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

:

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

Ve nihayet bu erişmesi gereken çocuk rota olduğunu

Bu iki dinamik kesimleri ile yönlendirici olduğunu Oyun modeli ve yazdıklarım buydu. Ama ne yaptığım önemli değil, console.log() her zaman null'u yazdırıyor. Ben game değişken işaretlerseniz, isLoad özelliği her zaman null:

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 şey yanlış yapıyor, ya da (I şüpheli gibi) bazı Kor konseptini kaçırıyorum?

cevap

6

Kodunuzun bu kısmı iyi görünüyor. Sizin varsayımlarınız doğruysa, iç içe rota modelFor aracılığıyla ebeveynin modelini almalıdır.

Bulma yönteminizin hatanın kaynağı olduğundan şüpheleniyorum. Ben senin previous question bakmak ve aynı Game.find burada kullanıldığı varsayılır (?)

Sorun, Promises ile ilgilidir. Ember'in yönlendiricisi, model kancasının async yapısını anlıyor. Ama işe yaraması için Promise'u geri göndermenize bağlı. Şu anda jQuery sözünü kullanıyorsunuz ancak game nesnesini henüz başlatılmamış haliyle döndürüyorsunuz. Sorgu sunucudan yüklenir ancak model() kancasının bu işlemden önce çözülmüş olduğu varsayılır.

jQuery Promise ürününü model kancadan doğrudan geri döndürmek istersiniz + İlk then numaralı ayrıştırmayı gerçekleştirin ve sonuç olarak bunu döndürün.

Modifiye ettiğiniz Game.find. Aynı prensipler diğer bulucular için de geçerlidir.

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; 
    }); 
} 

Oyun nesnesinin olduğu gibi döndüğünü unutmayın. Ember, sözün çözüldüğü zaman (bir sözden başka bir şey döndürerek), bu sonucun model() kancasının modeli olduğunu anlar. Bu game nesnesi, şimdi iç içe geçmiş rotada modelFor'da bulunacak modeldir.

+0

Tam olarak sorun buydu. Buradaki komik kısım dün yaptığınız değişikliği denedim, ama tanrı nedenini biliyordu, ben sadece 'bul' yöntemini değiştirdim ve Oyun'u dokunulmamış ve yanlış bıraktım. Zekice beni. Bu arada, önceki soruma bakma ve cevabı tamamlamak için kullanabileceğim için bir başka +1 vereyim. Çok teşekkür ederim! –

+0

Bu kod çok tanıdık geliyordu. :) –

İlgili konular