2014-05-10 4 views
11

Ich versuche, die zurückgegebenen Daten in meiner Template.rendered Funktion zu erhalten.meteorjs eisen-router waitOn und Verwendung als Daten auf gerenderten

Der aktuelle Code ist:

this.route('editCat', { 
    layoutTemplate : 'layoutCol2Left', 
    template : 'modCategoriesEdit', 
    path : '/mod/categories/edit/:_id', 
    yieldTemplates : _.extend(defaultYieldTemplates, { 
    'navigationBackend' : {to : 'contentLeft'} 
    }), 
    waitOn : function() { 
     return Meteor.subscribe('oneCat', this.params._id); 
    }, 
    data : function() { 
     return Categories.findOne({_id : this.params._id}); 
    } 
}); 

In diesem Block i auf dem Abo warte der Collection Document und das Dokument als Daten zurück.

Jetzt kann ich das zurückgegebene Dokument in meiner Vorlage wie folgt verwenden:

<template name="modCategoriesEdit"> 
    <h1>Edit {{name}}</h1> 
</template> 

Mein Problem ist, dass ich die zurückgegebenen Daten in meiner gerenderten Funktion wie folgt verwenden:

Template.modCategoriesEdit.rendered = function() { 
    console.log(this.data); 
} 

Aber Dies gibt "null" zurück.

Also meine Frage ist: Wie ist es möglich, Zugriff auf die zurückgegebenen Daten in der gerenderten Funktion zu erhalten?

Antwort

14

Lösung:

Fügen Sie einfach den folgenden Code zu Ihrer Eisen-Router Route() -Methode.

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

Dann wird die Vorlage gerendert, nachdem alles korrekt geladen wurde.

+2

Ihre Lösung zu verbessern, können Sie auch ein 'anderes hinzufügen {this.render ('YouLoadingTemplate')}' – fabien

+1

Ich dachte, dass ist was waitOn gemacht hat. Seltsam. – stringparser

+0

Ich dachte das auch! Aus diesem Grund habe ich mich gefragt, ob in meiner Vorlage keine Daten verfügbar sind. – TJR

10

Es gibt drei Lösungen, wenn Sie warten wollen, bis die WaitOn Daten vor dem Rendern bereit ist:

1- schreiben action Haken jeder Strecke

Router.map(function() 
    { 
    this.route('myRoute', 
     { 
     action: function() 
      { 
      if (this.ready()) 
       this.render(); 
      } 
     } 
    } 

2- die onBeforeAction Verwenden Haken global oder auf jeder Route

Beispielcode für den globalen Hook:

Router.onBeforeAction(function(pause) 
    { 
    if (!this.ready())   
     { 
     pause(); 
     this.render('myLoading'); 
     } 
    }); 

myLoading (oder welcher Name auch immer) muss eine Vorlage sein, die Sie irgendwo definiert haben.

Sie die this.render Linie nicht vergessen, da sonst das Problem tritt auf, wenn die Route (während das ursprüngliche Problem tritt auf, wenn Laden die Strecke) zu verlassen.

3- Über die eingebaute in onBeforeAction('loading') Haken

Router.configure(
    { 
    loadingTemplate: 'myLoading', 
    }); 

Router.onBeforeAction('loading'); 

myLoading (oder was auch immer Name) muss eine Vorlage, die Sie irgendwo definiert haben.

3

Wie @Sean sagte, die richtige Lösung ist eine Lade Vorlage zu verwenden:

Router.onBeforeAction("loading"); 

Aber wenn Sie es nicht wollen, wie ich, kam ich mit dieser Lösung nach oben :

Template.xxx.rendered = function() { 
    var self = this; 

    this.autorun(function(a) { 
     var data = Template.currentData(self.view); 
     if(!data) return; 

     console.log("has data! do stuff..."); 
     console.dir(data); 
     //... 
    }); 
} 

Template.currentData reaktiv ist, so in der ersten Zeit null ist und in der zweiten hat es Ihre Daten.

Ich hoffe, es hilft.

- Getestet auf Meteor v1.0 mit Iron Router v1.0

Verwandte Themen