2013-04-11 30 views
16

Mam dyrektywę, która zastępuje mój niestandardowy tag zwykłym HTML. Jest kilka atrybutów, które chciałbym usunąć. Na przykład, ze względu na składnięAngularJS usuń atrybuty

<ui mybutton width="30"></mybutton> 

moja dyrektywa przekształca go w

<div width="30" class="btn">bla bla </div> 

Chcę usunąć i dodać, że "width=30"style="width:{{old width value here}}"

byłem eksperymentuje z funkcją kompilacji i łącza. Czy powinienem to zrobić w kompilacji lub w funkcji łącza?

Myślałem, że muszę to zrobić w funkcji kompilacji, ponieważ chcę dokonać modyfikacji w szablonie.

Zobacz na żywo w http://jsfiddle.net/WptGC/2/OSTRZEŻENIE: przeglądarka może się zawiesić! Zobacz na żywo i bezpiecznie http://jsfiddle.net/WptGC/3/ kod, który powoduje, że wszystko jest skomentowane.

.directive('mybutton', function($compile) { 
return { 
    restrict: 'A', 
    //transclude: true, 
    template: '<div class="this is my subscreen div" style="width:{{width}}"></div>', 
    replace: false, 
    /*scope: { 
     width: '@', 
     height: '@', 
     x: '@', 
     y: '@' 
    },*/ 

    compile: function($tElement, $tAttrs) { 
     console.log("subscreen template attrs:"); 
     console.log($tAttrs); 
     var el = $tElement[0]; 
     //el.getAttribute('width'); 
     var stylewidth = el.getAttribute('width'); 
     el.removeAttribute('width'); 

     return function(scope) { 
      $compile(el)(scope); 
     } 
    } 
} 
}) 

Ja tylko coraz dziwną pętlę (tj console.log pojawia się kilka tysięcy razy)

+1

powodem były coraz pętla, że ​​zadzwonisz $ skompilować tego samego elementu i tak funkcja kompilacji jest wywoływana ponownie. – kvetis

Odpowiedz

26

ile mi brakuje jakiegoś innego wymogu należy po prostu być w stanie wykorzystać izolować zakresu oraz szablon jak:

http://jsfiddle.net/WptGC/6/

app.directive('backbutton',function(){ 
    return { 
    restrict: 'A', 
    replace:true, 
    scope: { 
     x: '@', 
     y: '@' 
    }, 
    template:'<button style="width: {{x}}px; height: {{y}}px">A back-button template</button>', 
    link: function (scope, element, attrs) { 
     element.removeAttr('x').removeAttr('y'); 
    } 
    } 
}); 
+0

hi, Tak, to jest to, co starałem pierwszy, ale zachowuje oryginalne atrybuty: '

' to mnie myśleć, że muszę użyć funkcji kompilacji ale 'funkcji return (zakres) { $ kompilacji (el) (zakres); } 'powoduje awarię przeglądarki możesz sprawdzić wygenerowany kod w jsfiddle też –

+0

Zmodyfikowałem odpowiedź. Nie spędziłbym jednak zbyt wiele czasu na martwieniu się o znaczniki, ponieważ Angular ma z tym swobodny dostęp. Czy istnieje jakiś powód, dla którego nie można pozostawić w kodzie HTML x = "10.0"? – Langdon

+1

tak, czasami nie będzie to "x" lub "y", ale "szerokość" i inne atrybuty, które mogą definiować układ komponentów. wartość będzie taka sama jak w css, więc nie będzie to teraz ból w szyi, ale w przyszłości może być trudny do utrzymania. Twoja odpowiedź działa! wielkie dzięki. –

Powiązane problemy