2012-12-22 16 views
5

A volte mi ritrovo a dichiarare gli stessi dati a più modelli. Per esempio:Puoi condividere i dati su più modelli?

Template.auction_page.auctionDurations = function() { 
    return [ 30, 60, 120 ]; 
}; 

Template.auction_editor.auctionDurations = function() { 
    return [ 30, 60, 120 ]; 
}; 

mi può fare meglio utilizzando una globale:

Template.auction_page.auctionDurations = function() { 
    return global.auctionDurations; 
}; 

Template.auction_editor.auctionDurations = function() { 
    return global.auctionDurations; 
}; 

Ma esiste un modo per sbarazzarsi delle dichiarazioni del tutto? In altre parole, esiste un modo per condividere alcuni dati globali su più modelli per impostazione predefinita?

risposta

5

Trovato una buona soluzione (con l'aiuto di un Helper!).

tuo globale:

global = _.extend({}, { 
    regions: [ "Americas", "Europe", "Asia" ] 
} 

L'helper:

Handlebars.registerHelper("global", function(name) { 
    return global[name]; 
}); 

Ora tutti i modelli possono fare uso di esso:

<select> 
    {{#each global "regions"}} 
    <option>{{this}}</option> 
    {{/each}} 
</select> 
1

È possibile utilizzare Session per questo:

Template.auction_page.auctionDurations = function() { 
    return Session.get("auctionDurations"); 
    } 
    Template.auction_editor.auctionDurations = function() { 
    return Session.get("auctionDurations"); 
    } 

un bel bonus di utilizzare sessione è che, dal momento che è una fonte di dati reattiva, l'impostazione causerà tutti i modelli che dipendono da esso per essere ri-renderizzati. Quindi la durata dell'asta si aggiornerà non appena si chiama Session.set("auctionDurations", [ 30, 60, 120 ]);

+0

Sry, ma hai frainteso. Volevo sbarazzarmi di queste dichiarazioni di incarico del tutto. – Dave

2

L'uso di una funzione di supporto è un grazioso buona soluzione generica Per completezza, puoi anche fare un semplice incarico:

Template.auction_page.auctionDurations = Template.auction_editor.auctionDurations; 
+0

Ah si, anche questa può essere una buona scorciatoia. Penserei che questo potrebbe o meno funzionare a seconda dell'ordine di caricamento. Ma uno sguardo ad alcuni dei miei codici esistenti suggerisce che in questo caso l'ordine di caricamento non è rilevante. Mi sto perdendo qualcosa qui? – Dave

+0

L'ordine di caricamento non si comporterà per due motivi: 1) si stanno ottenendo esplicitamente i valori indipendentemente dall'ordine di rendering, 2) in questo caso in particolare, i valori sono statici (sebbene abbia funzionato anche con raccolte dinamiche). –

Problemi correlati