2013-10-24 5 views
5

Ich habe versucht, eine Richtlinie zu erstellen:ng-Klasse nicht in einer Richtlinie arbeiten

app.directive('barsCurrent', function() { 
    return { 
     restrict: 'E', 
     link: function postLink(scope, element, attrs) { 
      attrs.$observe('value', function (newValue) { 
       // value attribute has changed, re-render    
       var value = Number(newValue); 
       var dval = value/3; 
       element.children().remove(); 
       while (dval > 0) { 
        element.append('<div id="bar" ng-class="{true: 'greater',false: 'less'}[charge.current >= charge.max]" style="float:left; color:green; height: 17px;margin-top:7px;background-color:green;">.</div>') 
        dval--; 
       } 
      }); 
     } 
    }; 
}); 

und ng-Klasse funktioniert nicht. Irgendwelche Gedanken, warum es nicht funktioniert oder können Sie einen anderen Weg vorschlagen, es zu tun?

Dies ist mein Controller:

app.controller("controller", function ($scope) { 
    $scope.chargeability = [{ date: '15-Sep-13', max: 100, current: 100 }, 
    { date: '30-Sep-13', max: 60, current: 50 }, 
    { date: '15-Oct-13', max: 80, current: 20 }]; 
    $scope.ytd = 122; 
}); 

und hier ist der HTML-Körper:

<div ng-repeat="charge in chargeability"> 
<bars-current style="z-index:999999;" value="{{charge.current}}">current:{{charge.current}}</bars-current> 
<div style="clear:both;height:6px;"></div> 

Ich möchte diese Art im ng-Klasse erreichen:

<style> 
.greater { 
    color:#D7E3BF; 
    background-color:#D7E3BF; 
} 
.less { 
    color:#E5B9B5; 
    background-color:#E5B9B5; 
} 
</style> 
+2

Versuchen Sie '$ compile (element.contents()) (scope);' in der Direktive nach der while-Schleife hinzuzufügen. – AlwaysALearner

+0

@CodeHater hat Recht. Sie müssen auch '$ compile' in die Direktive einfügen. –

+0

@CodeHater, habe ich versucht, $ kompilieren (element.contents()) (Bereich); aber es funktioniert immer noch nicht – user2756589

Antwort

4

Sie w Sie müssen den $compile Dienst verwenden, da Sie in der link Funktion innerhalb der Direktive arbeiten.

Sobald Sie die link Funktion getroffen, wird das DOM bereits gebaut, und Winkel wird nicht von irgendwelchen Änderungen bewusst sein, Sie in der link Funktion auf das DOM machen, wenn Sie die Änderungen durch den $compile Dienst ausführen.

Versuchen Sie, diese (nicht getestet):

app.directive('barsCurrent', function ($compile) { 
    return { 
     restrict: 'E', 
     link: function postLink(scope, element, attrs) { 
      attrs.$observe('value', function (newValue) { 
       // value attribute has changed, re-render    
       var value = Number(newValue); 
       var dval = value/3; 
       element.children().remove(); 
       while (dval > 0) { 
        var newDom = '<div id="bar" ng-class="{true: \'greater\',false: \'less\'}[charge.current >= charge.max]" style="float:left; color:green; height: 17px;margin-top:7px;background-color:green;">.</div>' 
        element.append($compile(newDom)(scope)); 
        dval--; 
       } 
      }); 
     } 
    }; 
}); 

Hier ist ein Beispiel jsfiddle die $compile innerhalb einer Richtlinie link Funktion verwendet:

Fiddle

UPDATE:

Hier ist ein jsfiddle mit einige Änderungen, die die gewünschten Ergebnisse liefern können:

Fiddle

UPDATE 2:

ich die Geige wieder aktualisiert. Es sollte jetzt das gewünschte Ergebnis sein. Gleiche Geige, gerade aktualisiert. (Benutze den Link oben).

+0

Hallo Tyson, immer noch nicht funktioniert .. Glaubst du es ist, weil es nicht die Ladung erkennen kann. Strom und Ladung.max in der ng-Klasse? – user2756589

+0

Das könnte sein. Ihre Direktive hat keinen isolierenden Gültigkeitsbereich. Daher sollte sie in der Lage sein, den Gültigkeitsbereich vars des übergeordneten Gültigkeitsbereichs zu sehen. Sind da "charge.current" und "charge.max" vorhanden? Ich würde versuchen, sie console.log in der Direktive Link-Funktion, nur um sicherzustellen, dass sie von der Direktive referenziert werden können. Auch ich bin nicht vertraut mit der Art und Weise, in der Sie die 'ng-Klasse' verwenden, also kann ich nicht sagen, ob das funktioniert oder nicht. Wenn die Logik in der 'ng-Klasse 'komplex wird, verschiebe ich sie normalerweise in eine separate' scope'-Methode. –

+0

Die ng-Klasse ändert nur die Hintergrundfarbe des div..das ist wenn Ladung.aktuell> = Max laden, dann ist es avocado grün else pink ... Ich habe versucht, console.log in die Link-Funktion zu setzen..wie auch immer, ich treffe Fehler wie Ladung undefiniert ... und das ganze barscurrent hat noch nicht funktioniert – user2756589

Verwandte Themen