2013-08-23 28 views
6

için özel enterpolasyon sembolleri kullanıyor. Şu anda açısal olarak kullanmak istediğim ve yine alt çizgi ile kullanabileceğim bir underscore.js şablonum var.Angularjs, kapsamı

angular.directive('underscoreTemplate', function ($parse, $compile, $interpolateProvider, $interpolate) { 
    return { 
     restrict: "E", 
     replace: false, 
     link: function (scope, element, attrs) { 
      $interpolateProvider.startSymbol("<%=").endSymbol("%>"); 
      var parsedExp = $interpolate(element.html()); 
      // Then replace element contents with interpolated contents 
     } 
    } 
}) 

Ama bu

Error: Unknown provider: $interpolateProviderProvider <- $interpolateProvider <- underscoreTemplateDirective

için kullanılabilir $interpolateProvider mi hata tükürür: Böyle bir yönergesini kullanarak belirli bir kapsam için interpolasyon başlangıç ​​ve bitiş sembollerini değiştirmek mümkün acaba modül yapılandırması? <%= değerini {{ ve %> - }} olarak değiştirmek için dize değiştirmeyi kullanmak daha iyi bir çözüm olabilir mi?

Ayrıca, ben element.html()%> yılında <%= yılında < ve > kaçar fark ettim. Bu otomatik kaçmayı önlemek için bir yolu var mı?

cevap

2

Tamam, bir çift sorununuz var ama Sizin için bir çözüm buldum.

Demo

http://jsfiddle.net/colllin/zxwf2/

Sayı Eğer element.html() aradığınızda sizi < ve > karakter &lt; ve &gt; dönüştürülür ediliyor 1

böylece, hatta bir örneğini bulamazsınız Bu dizede < veya >.

Sayı 2

$interpolate Hizmet zaten $interpolateProvider tarafından "sağlanan" olmuştur beri startSymbol ve endSymbol düzenleyebilir gibi gözükmüyor. Ancak,, özel startSymbol ve endSymbol öğelerini, bağlantı işlevinizde dinamik olarak açısal başlangıç ​​/ bitiş simgelerine dönüştürebilirsiniz.

Çözüm

myApp.directive('underscoreTemplate', function ($parse, $compile, $interpolate) { 
    return { 
     restrict: "A", 
     link: function(scope, element, attrs) { 
      var startSym = $interpolate.startSymbol(); 
      var endSym = $interpolate.endSymbol(); 
      var rawExp = element.html(); 
      var transformedExp = rawExp.replace(/&lt;%=/g, startSym).replace(/&lt;%-/g, startSym).replace(/%&gt;/g, endSym); 
      var parsedExp = $interpolate(transformedExp); 

      scope.$watch(parsedExp, function(newValue) { 
       element.html(newValue); 
      }); 
     } 
    } 
}); 

Alternatifler

ben emin değilim, ama ben kullanarak kendi özel $interpolate hizmeti örneğini bir yolu vardır eminim $interpolateProvider (alt çizgi etiketler için yapılandırmaya sonra) .

+1

Teşekkürler, bu harika çalışıyor! Tüm örnekleri değiştirmek için küçük bir değişiklik yaptım ('g' ile regex kullan): http://jsfiddle.net/e3s5d/ –

+0

Harika çağrı. Güncelleme yanıtı. – colllin

+0

Artık, <% - 'sözdizimini işaret ettiniz, altyazıdaki <% =' varsayılanının açısal '

'ile daha benzer olduğunu anlıyorum. Belki de "
" ile ham ifadede '<% = '' değiştirerek çıkışsız html'ye izin vermek için bu yönergeye bazı mantık ekleyebilirsiniz. Referans: http://stackoverflow.com/a/10971756/361609 – colllin

İlgili konular