2014-05-14 17 views
5

Bir kesme işareti içeren bir değişkeni ({{title}}) kullanıyorum. Bıyık bunu ' olarak çıkarır.JavaScript için kesme işareti içeren Kaçış Bıyık Değişkeni

Ancak bir JavaScript hatası aşağıdaki şablon sonuçları (Expected token ')'):

Bıyık render sonra
<a href="javascript:confirm('{{title}}?');">{{title}}</a> 

, sözdizimi hatası ('Joe's Lame?') açık: Ben hala Bıyık öğreniyorum

<a href="javascript:confirm('Joe's Lame?');">Joe's Lame</a> 

ve bu örnek devam ederken, bu durumlarda değişkenlerden kaçmanın doğru yolu nedir? Referans için fiddle.

+0

İlginç! Sanırım bu, Bıyık ile mümkün değil. Gidonlar ('Handlebars.registerHelper') ... – hgoebl

+0

@hgoebl ile ilgili bir problem olmaması halinde, çözümün Bıyık olması gerekmiyor. –

+0

O zaman [Gidonlar] 'a (http://handlebarsjs.com/) bir göz atmalısınız. Bıyık bir üst kümesidir ve çok kolay genişletilebilir. 'EscapeJs' gibi bir yardımcı-işlev oluşturmalı ve kaydetmelisiniz ve şablonunuzda '{{escapeJS title}} 'gibi kullanın. Zaman bulursam kemanını çatallayacağım. – hgoebl

cevap

2

Eğer Bıyık olmak zorunda değilse, Handlebars adı verilen bir Bıyık Üstünü kullanabilirsiniz.

Handlebars.registerHelper('escapeJs', function(str) { 
    return str.replace(/[\'\"\\\/]/gm, function (c) { 
     return '\\' + c; 
    }); 
}); 

Ve bu {{escapeJs title}} gibi yardımcı çağırır:

İlk bir Gidon yardımcı kayıt bu fiddle canlı

var view = { 
    title: "Joe's Lame\"\\/€" 
}; 

var template = Handlebars.compile(
    "<a href=\"javascript:confirm('{{escapeJs title}}');\">{{title}}</a>"); 
var output = template(view); 

Görünüm bunu.

Bıyık gerçekten harika ve neredeyse her programlama dilinde mevcut. Gidonlar harika ve ör. Backbone Thorax ve assemble, güçlü bir statik web sitesi üreticisi.

Düzenleme: Alternatif Çözelti

ECMAScript 5 (ve de IE8 çalışıyor olması gerekir takoz/sustalıyla/polyfills ile) kullanılarak, tek bir şu şekilde bıyık görüntüleme nesne hazırlamak olabilir. Kabul ediyorum ki, bu çok kullanışlı bir çözüm değil, ancak JavaScript çıktısı üretilirken, IMO kabul edilebilir. (Object.defineProperty yoluyla) yeni bir özellik tanımlama

function escapeJs (str) { 
    return str.replace(/[\'\"\\\/]/gm, function (c) { 
     return '\\' + c; 
    }); 
} 

var view = { 
    title: "Joe's Lame" 
}; 

Object.defineProperty(view, 'titleJsEnc', { 
    enumerable: false, 
    get: function() { return escapeJs(this.title); } 
}); 

var output = Mustache.render(
    "<a href=\"javascript:confirm('{{titleJsEnc}}');\">{{title}}</a>", view); 

hile yok. Kaçınan dize değerini döndüren her bir gerçek özellik için bir alıcı tanımlayan bir genel nesne dekoratörü yazılabilir. İşte

fiddle

Düzenleme geçerli: Alternatif: Bu pull-request birleştirilir ve Bıyık yeni bir sürümü yayınlandıktan sonra bu sorun bir şekilde çözülmesi gerektiğini

Bıyık yeni bir sürümü bekleyin "Bıyık yerli yolu".

+0

+ Ancak, çözümün Bıyık olması gerekmediğini söylediğimde, * herhangi bir * teknoloji olabileceği anlamına gelmedim. Problemi kullandığım teknolojilerden biri ile çözmek istiyorum. –