2013-12-16 5 views
5

Ich habe dieses Problem in seine einfachste Form zerlegt. Grundsätzlich habe ich eine Direktive, die für die Demo noch nicht wirklich etwas bewirkt. Ich habe ein Div mit der Direktive als Attribut. Die Werte innerhalb des div, die von einem Objekt-Array stammen, werden nicht angezeigt. Wenn ich die Anweisung aus dem Div entfernen, werden sie OK angezeigt. Offensichtlich fehlt mir hier etwas wirklich Offensichtliches, da ich das bisher ohne Probleme gemacht habe.Daten von der Direktive werden nicht in ng-repeat angezeigt

Hier ist der Plunk: http://plnkr.co/edit/ZUXD4qW5hXvB7y9RG6sB?p=preview

Script:

app.controller('MainCtrl', function($scope) { 

    $scope.tooltips = [{"id":1,"warn":true},{"id":2,"warn":false},{"id":3,"warn":true},{"id":4,"warn":true}]; 

}); 

app.directive("cmTooltip", function() { 
    return { 
     scope: { 
      cmTooltip: "=" 
     } 
    }; 
}); 

HTML

<div ng-repeat="tip in tooltips" class="titlecell" cm-tooltip="true"> 
    A div element: {{ tip.id }} 
</div> 
<br><br> 

Just to prove it works without the directive: 
<div ng-repeat="tip in tooltips" class="titlecell"> 
    A div element: {{ tip.id }} 
</div> 
+0

Wenn Sie Ihre eckige Version auf die neueste Version (1.2.5) umstellen, funktioniert Ihr Plunk: https://ajax.googleapis.com/ajax/libs/angularjs/1.2.5/angular.min.js – Beyers

+0

Würde ich gerne tun, aber ich habe 8000 Zeilen Code, die alle aktualisiert werden müssten - nicht zu scharf! –

Antwort

1

Es gibt eine hacken, um es durch den Einsatz von transclusion, wie das in früheren Versionen von Winkeln zu machen die Arbeit:

app.directive("cmTooltip", function() { 
    return { 
     scope: { 
      cmTooltip: "=" 
     }, 
     transclude: true, 
     template : '<div ng-transclude></div>' 
    }; 
}); 

PLNKR

+0

Brilliant, genau das habe ich gebraucht! –

+0

Froh, dass es für Sie funktioniert hat! –

1

Wie von Beyers' Kommentar oben und unten, ist die Frage, das Verhalten etwa nicht mehr in mindestens 1.2.5

Um klarer zu sein; dies hat nichts mit ng-repeat zu tun, können Sie es entfernen und es wird immer noch keine tip (oder tooltips).

Siehe this Frage, was die = und andere Konfigurationen bedeuten und was es für Sie tut.

Grundsätzlich für Ihre Situation, wenn Sie = verwenden, wird der Geltungsbereich der Direktive in den zugrunde liegenden Elementen verwendet werden, Sie haben nicht mehr den Umfang Ihres Controllers. Was das für Sie bedeutet ist, dass es keine {{ tip.id }} oder nicht einmal tip gibt. Weil die Richtlinie keine liefert.

Hier ist eine plunker, die zeigt, was Sie damit machen können.

Im Grunde alles, was ich tat, war

app.directive("cmTooltip", function() { 
    return { 
     scope: { 
      cmTooltip: "=" 
     }, 
     link: function($scope){ // << 
      $scope.tip = { id: 1 }; // << 
     }       // << 
    }; 
}); 

Dies schafft die Spitze Objekt auf dem Umfang, so dass es eine ID hat.

Für Ihre Situation würden Sie wahrscheinlich einfach nicht verwenden = und schauen Sie sich this Frage für Ihre anderen Optionen, je nachdem, was Sie wollen.

+0

Siehe mein Kommentar oben, nur die ursprüngliche Plunk zu ändern, um die neueste (1.2.5) eckige Version zu verwenden, macht es funktioniert. Ich vermute also, dass es in den letzten Versionen einige Fehlerbehebungen in Bezug auf mehrere Direktiven und isolierte Bereiche gab. – Beyers

+0

Danke, ich dachte, ich hätte das auch versucht, indem ich 'data-require =" [email protected] "geändert habe. Ich dachte, ich hätte es bereits überprüft, es gab viele Änderungen von 1.0 auf 1.2 ich füge das hinzu. – Philipp

+0

Dank Philipp, das hat mir wirklich geholfen, die isolierenden Bereiche zu verstehen. –

-2

Meiner Meinung nach ist das nicht der Weg zu gehen. Ich würde Objekte verwenden.

JS-Code:

function tooltip(id,warn){ 
    this.id = id; 
    this.warn = warn; 
    } 

    tooltip.prototype.toString = function toolToString(){ 
    return "I'm a tooltip, my id = "+this.id+" and my warn value = "+this.warn; 
    } 

    $scope.tooltips = [new tooltip(1,true),new tooltip(2,false),new tooltip(3,true),new tooltip(4,true)]; 

HTML:

<div ng-repeat="tip in tooltips" class="titlecell"> 
     A div element: {{ tip.toString() }} 
    </div> 
+0

Der OP weiß, wie man das macht, indem er seine Anweisung entfernt, die Frage ist, warum es nicht funktioniert, wenn er die Richtlinie anwendet. Das ist nicht das, worum es in der Frage geht, und Sie stellen im Grunde sogar View-Logik in das JS. wtf? – Philipp

+0

Ich stimme zu - Danke für die Antwort, aber es hat nichts mit meiner Frage zu tun. –

Verwandte Themen