13

Sto usando il modello Underscore (che si basa sul Microtemplate di John Resig) e ogni volta che provo a sostituire interruzioni di riga al suo interno, ottengo strani comportamenti. Per esempio, se ho testo come questo:Underscore/Microtemplate Sostituisci interruzioni di riga - Strange Behaviour

var message = 'Line1\r\n\r\nLine2'; 

posso sostituire correttamente interruzioni di riga con le etichette br se faccio questo:

$('#example1_no_template').html(message.replace(/\r?\n/g, '<br />')); 

Tuttavia, se provo a sostituire le interruzioni di linea all'interno della sottolineatura modello con il codice di esempio riportato di seguito, non ho ricevuto nessun tag br inserito:

<script id="template1" type="text/html"> 
    <%= message.replace(/\r?\n/g, '<br />') %> 
</script> 

<script> 
var template1 = _.template($('#template1').html()); 
$('#example1_template').html(template1({ message: message })); 
</script> 

E stranamente, se cambio la mia espressione regolare all'interno del modello per quanto segue, poi ho tutti i tipi di tag br I inserite in modo tutto il luogo:

<script id="template3" type="text/html"> 
    <%= message.replace(/[\r\n?]/g, '<br /><br />') %> 
</script> 

Tutti questi comportamenti sono mostrati in questo violino: http://jsfiddle.net/GHtDY/5/

Qualsiasi idea di cosa sta succedendo? È possibile sostituire le interruzioni di riga all'interno del modello?

risposta

8

Mi chiedo se il parser di template di Underscore abbia un po 'di bug da qualche parte. Se si utilizza la sintassi oggetto RegExp al posto della sintassi letterale regex:

<script id="template1" type="text/html"> 
    <%= message.replace(new RegExp('\r?\n', 'g'), '<br />') %> 
</script> 

poi si inizia ottenere i risultati attesi: http://jsfiddle.net/ambiguous/GHtDY/6/

tua "uscita funky" Esempio:

<%= message.replace(/[\r\n?]/g, '<br /><br />') %> 

è in arrivo out funky perché Underscore sta sostituendo lo n con gli elementi <br>. Ad ogni modo, quella classe personaggio dovrebbe corrispondere a qualsiasi CR, LF o punto interrogativo e non è quello che stai cercando di fare comunque.

Sospetto che il parser di template di Underscore abbia qualche problema con alcuni valori letterali di regex; noterai che /\s/g non funziona come previsto. In particolare, sembra avere qualche problema nell'analizzare sequenze di escape come \r e \s all'interno di un regex letterale. Ad esempio, questo:

<script id="template1" type="text/html"> 
    <%= message.replace(/\d/g, '<br /><br />') %> 
</script> 

non funziona come previsto quando message contiene alcune cifre, ma utilizzando new RegExp

<script id="template1" type="text/html"> 
    <%= message.replace(new RegExp('\d', 'g'), '<br /><br />') %> 
</script> 

funziona come previsto.

+0

Ottima spiegazione. Grazie. –

Problemi correlati