2015-01-18 19 views
10

Voglio passare un nuovo parametro a un modello mantenendo il suo contesto dati originale.Passare parametri al modello senza sovrascrivere il contesto dati

  • contesto dati originali: {messaggio: "ciao"} {{> myTemplate withIcon=True}}
  • contesto dati viene sovrascritto con {withIcon: True}

acually la mia soluzione è quella di avvolgere di dati di questo tipo.

<code> 
{{> myTemplate originalData=this withIcon=True}} 
</code> 

C'è una soluzione migliore?

risposta

13

Si può sempre estendere il contesto attuale in un aiutante:

Template.parentTemplate.helpers({ 
    iconContext: function() { 
    var result = _.clone(this); 
    result.withIcon = true; 
    return result; 
    } 
}); 

e usarlo in questo modo:

<template name="parentTemplate"> 
    {{> myTemplate iconContext}} 
</template> 

In alternativa, è possibile creare un aiuto più generico come questo:

Template.registerHelper('extendContext', function(key, value) { 
    var result = _.clone(this); 
    result[key] = value; 
    return result; 
}); 

E quindi scegliere le coppie chiave/valore dall'interno di html di qualsiasi modello:

<template name="parentTemplate"> 
    {{> myTemplate extendContext 'withIcon' true}} 
    {{> myTemplate extendContext 'isAwesome' false}} 
</template> 

Una soluzione è più desiderabile di nascondere i dati originali in un campo separato, poiché mantiene il modello figlio generico.

+0

Potete per favore elaborare un po 'di più? Perché vuoi fare _.clone (questo)? – massimosgrelli

+0

Perché vuoi fare _.clone (questo)? Cosa succede se aggiungo risultato a un contesto di dati figlio? Qualcosa come iconContext: function (childDataLikeMsgPost) {... childDataLikeMsgPost.withIcon = ...} Questo mi aiuterebbe molto – massimosgrelli

7

Sulla David's second option per consentire più attributi:

<template name="parentTemplate"> 
    {{> myTemplate extendContext withIcon=true label="Has Icon" }} 
    {{> myTemplate extendContext withIcon=false label="No Icon" }} 
</template> 

e poi in javascript:

Template.registerHelper('extendContext', function(data) { 
    var result = _.clone(this); 
    _.each(data.hash, function(value, key) { 
    result[key] = value; 
    }) 
    return result; 
}) 
+0

Questo è veramente bello. –

+2

Anche questo dovrebbe funzionare: 'return _.extend ({}, this, data.hash);' –

Problemi correlati