5

Mam dyrektywę, która buduje menu podręczne, które automatycznie zbiera dane z HTML. W rzeczywistości ma on przekształcać zestaw elementów zgodnych z karuzelą Bootstrap w listę. Łapacz jest to, że każdy .item przenosi atrybut z jej wartość ciągu sączy jak w:Jak zrobić dyrektywę, używając filtrowanych atrybutów HTML?

HTML:

<div class="item" data-title="{{'My string' | myfilter}}"> 
    ... 
</div> 

Kiedy odwołuje dyrektywy do elementu, przy użyciu tego fragmentu:

.directive('sectionBuilder', function(){ 
    return { 
     priority:100, 
     restrict: 'C', 
     link: function(scope, element, attrs){ 
      var data = []; 
      $('.carousel-inner > .item', '#carousel').each(function(i, el){ 
       data.push({k: i, v: $(el).attr('data-title')}) 
      }); 
     } 
    } 
}) 

Dostaję menu nieprzetworzonych, nieprzetworzonych ciągów znaków w języku HTML:

{{'My string' | myfilter}} 
{{'My string 2' | myfilter}} 

Z tego co rozumiem, attrs. $obserw odnosi się do atrybutów elementu związanego z dyrektywami, ale nie do elementów zewnętrznych.

Jak uzyskać kątowość w celu użycia filtrowanych ciągów znaków? Próbowałem ustawić priorytet na wartości ekstremalne, ale bezskutecznie.

Odpowiedz

1

Można użyć ng-attr, że byłoby bardziej wygodne rozwiązanie. ng-attr-data-title dokona oceny interpolacji {{}} & Utwórz atrybut danych-title z wartością.

Zamiast data-title="{{'My string' | myfilter}}" korzystanie ng-attr-data-title="{{'My string' | myfilter}}"

Markup

<div class="item" ng-attr-data-title="{{'My string' | myfilter}}"> 
    ... 
</div> 

Aktualizacja

Jak otrzymujesz wartość jak {{'My string' | myfilter}}, {{'My string 2' | myfilter}} z interpolacją następnie można użyć $parse lub $interpolate usługi je ocenić.

.directive('sectionBuilder', function($interpolate){ 
    return { 
     priority:100, 
     restrict: 'C', 
     link: function(scope, element, attrs){ 
      var data = []; 
      $('.carousel-inner > .item', '#carousel').each(function(i, el){ 
       data.push({k: i, v: $interpolate($(el).attr('data-title'))}) 
      }); 
     } 
    } 
}) 
+0

Dzięki, @pankjparkar. Niestety to nie działa dla mnie. Ani '$ (el) .attr ('ng-attr-data-title')})' ani '$ (el) .attr ('data-title')})' wykonaj zadanie. – user776686

+0

czy renderujesz ten element używając 'ng-repeat'? –

+0

Nie. Jest to pojedyncza instancja. Przesunięcia karuzeli, które dostarczają ciągi pozycji menu, są robione w pętli '$ .each'. – user776686

0

W swoim dyrektywy, trzeba ustawić transclude właściwość prawdziwej i trzeba użyć szablonu HTML z ngTransclude jako atrybut przetwarzać domyślny filtr kątowy wewnątrz znaczników HTML.

Dla porównania:

http://tutorials.jenkov.com/angularjs/custom-directives.html

+0

Na początku pomyślałem: dobry połów - zapomniałem o transclude! Ale to też nie działało. Masz na myśli, że powinienem dodać ng-transclude do każdego slajdu karuzeli? – user776686

+0

Mam nadzieję, że musisz dołączyć atrybut ng-transclude do

...

+0

Działa bez odrobiny transclusion (ani js, ani html). Pamiętaj jednak, że moja dyrektywa nie wyprowadza szablonu, zbiera dane z rozwijanej listy. – user776686

0

Chyba masz pominąć skompilować szablon HTML. Spróbuj

$compile(' 
    <div class="item" data-title="{{'My string' | myfilter}}"> 
     ... 
    </div> 
') 
Powiązane problemy