2014-04-13 11 views
6

Demir-yönlendiricinin, oluşturmadan önce koleksiyonumda başarılı bir yöntem bulmasını beklediğim bir çözüm arıyorum.demir-yönlendirici Toplama işlemine başlamadan önce Collection.findOne() öğesini veri nesnesi olarak bekleyiniz

Benim rota şöyle görünür: Bu iyi çalışır

this.route('business', { 
     path : '/business/:type/:_id', 
     waitOn : function() { 
      return Meteor.subscribe('business', this.params._id); 
     }, 
     data : function() { 
      return Business.findOne({_id: this.params._id}); 
     } 
    }); 

. Görünüşe göre, demir-yönlendirici, Müşterinin doğru Belgesini geri almak için Koleksiyonun aboneliğini bekliyor. Ancak şablonumda ihtiyaç duyduğum verilerin findOne işlevi için bir gecikme var. Aynı sorunla Herkes için

Template.businessItemItem.rendered = function() { 
    console.log(Router.current().data()); // undefined 
    window.setTimeout(function(){ 
     console.log(Router.current().data()); // [Object] 
    }, 1000); 
} 

Çözüm . Yalnızca rotanız için "eylem" yöntemini ekleyin:

action : function() { 
    if (this.ready()) this.render(); 
} 

Bu yöntemde her şey benim için iyi çalışıyor.

+0

Sen benim kahramanımsın! Bu beni deli ediyordu. Çözümünüz mükemmel, ama daha fazla araştırma yapacağım: eğer demir-yönlendiricide bir hata varsa, github üzerinde bir sorun açmalıyız. Teşekkürler! – physiocoder

+0

Evet, bence gereken şekilde çalışmıyor. başvuru: https://github.com/EventedMind/iron-router/blob/dev/DOCS.md#waiting-on-subscriptions-waiton waitOn yönteminin render edilmeden önce verileri beklediğini ve döndürdüğünü söylüyor - ama bu Şu anda yaptığım şey değil ... – TJR

+0

Data() işlevi önce (ve sonra) action() yöntemi çağrıldığında (tarayıcının yeniden yüklenmesini sağlayarak rotayı yeniden yüklediğimde) bir durumun olduğunu eklemek için hızlı bir güncelleştirme . Bu durumda bile bu çözüm işe yaramıyor :-(bu yüzden eğer '(bu thisready())' i döndürdüm, 'post() metodunun ilk satırı olarak bu yazıyla önerildi: https://groups.google.com/forum/#!topic/meteor-talk/lK3v9ZxIbco – physiocoder

cevap

2

Sorununuzu alıp almadığınızdan emin değilim, ancak eğer yapsam, Controlling subscriptions ve özellikle Router.onBeforeAction('loading')'u okumalısınız. Şimdi, tekerleği yeniden icat ediyorsun.

+0

Yorumunuz için teşekkürler, ancak lütfen benim sorgama düzenlenmiş olan çözümüme bakın. Kullanımda olan this.ready eylem yöntemi iyi çalışıyor :) – TJR

+0

Sure işe yarıyor, çünkü temelde varsayılan "yükleme" kancasını yeniden kaydettiğinizden, her bir yol için geçerli olduğundan daha iyi olan çözümünüzle, bu "eylem" kodunu her rotada kopyalamak/yapıştırmak zorunda kalacaksınız. – saimeunt

+0

Aynı sorunu yaşıyorum. WaitOn() kanca kullanmayı denedim ve hiçbir şey yapmıyor gibiydi. Rotayı beklemek zorunda olan birkaç abonelik() çağrısı dizisi döndürüyordum, ama yapmadı. Timo'nun çözümü benim için çalıştı. Belki de demir-yönlendirici bir hata vardır. – Jachin