2013-03-25 22 views
10

Próbuję użyć stylu kierownicy szablon z underscore w kręgosłupie (z require.js). mam następujące:podkreślenia ustawienia interpolacji

_.templateSettings.interpolate = /\{\{(.+?)\}\}/g; 

w moich szablonach mam utworzenia Test:

<div><%= title %> | {{ title }}</div> 

otrzymuję następujący w przeglądarce:

Correct title | {{ title }} 

Tak to wygląda Standardowe ustawienia szablonu podkreślenia działają, a style kierownicy są ignorowane:

Ale jeśli mogę sprawdzić w konsoli w chromie mam ten (który patrzy na mnie jak to powinno być poprawne)

_.templateSettings 
Object {evaluate: /<%([\s\S]+?)%>/g, interpolate: /\{\{(.+?)\}\}/g, escape: /<%-([\s\S]+?)%>/g} 

Jakieś pomysły dlaczego to nie działa poprawnie?

Odpowiedz

16

Kiedy to zrobić:

_.templateSettings.interpolate = /\{\{(.+?)\}\}/g; 
var t = _.template($('#t').html()); 

z szablonu w #t, otrzymuję błąd:

SyntaxError: Unexpected token '='

To ładnie potwierdziła moje podejrzenie, że oceny regex:

/<%([\s\S]+?)%>/g 

pasuje do Twojego szablonu <%= ... %>. Znak równości pasuje do \S, więc oczywiście wyliczenie regex znajdzie <%= ... %>, usunie z <% i %> i pozostawi cię z błędem składni w JavaScript, który spróbuje zbudować _.template.

Jeśli spojrzeć wewnątrz _.template source zobaczysz że Wyrażenia regularne są sprawdzane w określonej kolejności:

  1. escape
  2. interpolate
  3. evaluate

Tak właśnie będzie zastąpienie interpolate niech wypadnie rzeczy, które zostaną przechwycone (i błędnie zinterpretowane) t evaluate.

Wszystko, co musisz zrobić, to również zastąpić wyrażenie regularne evaluate. Polecam zastąpienie wszystkich trzech regexes w celu uniknięcia problemów:

_.templateSettings = { 
    evaluate: /\{\{(.+?)\}\}/g, 
    interpolate: /\{\{=(.+?)\}\}/g, 
    escape:  /\{\{-(.+?)\}\}/g 
}; 

Demo: http://jsfiddle.net/ambiguous/SdLsn/

+0

Dzięki. Sprawdziłem wersję demo i wszystko wygląda dobrze, ale wciąż uzyskuję taki sam wynik jak poprzednio. Chromowa konsola pokazuje poprawne ustawienia, ale podkreślnik wciąż używa starych ustawień. –

+0

@jamieholliday: Brzmi jak możliwy problem z zamawianiem. Jaka jest różnica między demo jsfiddle.net a tym, co robisz? –

+1

OK, okazało się, że był to problem związany ze sposobem ładowania w ustawieniach. Używam wymagać.js i to powodowało problem. Uwięź problem, używając swojego wyrażenia regularnego i stosując ustawienie, jak tutaj: http://stackoverflow.com/questions/13057330 –