2014-11-17 10 views
8

Come posso rendere Iron: il router rielabora un modello?iron: il router non verrà nuovamente visualizzato dopo la modifica dell'itinerario con lo stesso modello

ho questo html:

<head> 
</head> 

<body> 
</body> 

<template name="mainLayout"> 
    <a href="{{pathFor route='list'}}">list</a> 
    <a href="{{pathFor route='find' query='q=xxx'}}">find</a> 
    {{> yield}} 
</template> 


<template name="listTemplate"> 
    <p>list</p> 
</template> 

e questo JS:

Router.configure({ 
    layoutTemplate: 'mainLayout' 
}); 

Router.route('/list', { 
    name: 'list', 
    template: 'listTemplate' 
}); 

Router.route('/find', { 
    name: 'find', 
    template: 'listTemplate', 
    data: function() { 
     return this.params.query; 
    } 
}); 


if (Meteor.isClient) { 
    Template.listTemplate.rendered = function() { 
     if (this.data) 
      console.log('find ' + this.data.q); 
     else 
      console.log('list all'); 
    };  
} 

Quando clicco sui link per passare da una visualizzazione (simulati qui con console.log), il percorso non cambia, ma il modello non è ri-reso. C'è un modo per forzare il ferro: il router per il rendering?

+0

Hai detto: "quando faccio clic sui link per cambiare vista", ma non stai cambiando effettivamente le visualizzazioni perché entrambi i percorsi utilizzano lo stesso modello. Dobbiamo sapere esattamente cosa stai cercando di fare qui. – Scott

+0

Penso di cambiare visualizzazione: la funzione Template.Rendered utilizza i dati forniti dal router per visualizzare una vista diversa, con dati diversi. (Sto simulando questo nel codice di esempio, ma la funzione di rendering "reale" ha un sacco di logica per mostrare viste diverse). Ho quindi anche dato al percorso un nome diverso e un URL diverso. Lo fa utilizzando lo stesso modello con diversi parametri. Riesco a vedere l'url cambiare mentre sto cambiando route, se ad esempio utilizzo un route suBeforeAction, viene chiamato, ma non riesco a recuperare il template con i nuovi dati e parametri. – willemx

+0

Stai davvero tralasciando troppo codice per essere in grado di aiutarti. Non riesco a pensare a una buona ragione per forzare un re-rendering sul modello. In generale, si desidera fornire al modello dati reattivi e aiutanti reattivi per controllare ciò che viene visualizzato. Se aggiorni la tua domanda e mi mostri effettivamente cosa stai cercando di fare, potrei essere in grado di fornirti una risposta più concreta. – Scott

risposta

1

si può provare qualcosa di simile:

Router.configure({ 
    layoutTemplate: 'mainLayout' 
}); 

Router.route('/list', { 
    name: 'list', 
    template: 'listTemplate', 
    action: function() { 
    this.state.set('query', this.params.query); 
    } 
}); 

Router.route('/find', { 
    name: 'find', 
    template: 'listTemplate', 
    data: function() { 
    return this.params.query; 
    }, 
    action: function() { 
    this.state.set('query', this.params.query); 
    } 
}); 


if (Meteor.isClient) { 
    Template.listTemplate.rendered = function() { 
    this.autorun(
     function() { 
     if (this.state.get('query')) 
      console.log('find ' + this.data.q); 
     else 
      console.log('list all'); 
     } 
    ); 
    }; 
} 

Il metodo reso non è reattiva, è per questo che avete bisogno di un autorun. Il modello "this.data" non è reattivo, quindi avrete bisogno di una var reattiva per farlo, sia una variabile Session, uno stato controller o qualche tipo di var reattivo.

Potrebbe essere necessario aggiungere il pacchetto reactive-var in base all'approccio scelto.

1

L'impostazione dello stato del controller router non ha funzionato per me. La risposta Antônio Augusto Morais fornita in questo relativo github issue funzionava. Usando la Sessione per memorizzare la var reattiva per innescare la riattivazione dell'autorun. È un hack, ma funziona.

## router.coffee 
Router.route '/profile/:_id', 
    name: 'profile' 
    action: -> 
    Session.set 'profileId', @params._id 
    @render 'profile' 

## profile.coffee 
Template.profile.onCreated -> 
    @user = new ReactiveVar 
    template = @ 

    @autorun -> 
    template.subscription = template.subscribe 'profile', Session.get 'profileId' 

    if template.subscription.ready() 
     template.user.set Meteor.users.findOne _id: Session.get 'profileId' 
    else 
     console.log 'Profile subscription is not ready' 

Template.profile.helpers 
    user: -> Template.instance().user.get() 

## profile.html 
<template name="profile"> 
    {{#if user}} 
    {{#with user.profile}} 
     <span class="first-name">{{firstName}}</span> 
     <span class="last-name">{{lastName}}</span> 
    {{/with}} 
    {{else}} 
    <span class="warning">User not found.</span> 
    {{/if}} 
</template> 
+0

Questo è quello che ho fatto perché non riuscivo a vedere lo stato del router definito all'interno della funzione onRendered. – Jeremiah

Problemi correlati