2014-01-05 9 views
9

Ich versuche eine ng-repeat zu verwenden, die eine ng-include enthält. Das Problem ist, dass das erste Element in der ng-Wiederholung ist nur die ng-include Vorlage mit keiner der Daten aus der ng-repeat ausgefüllt. Gibt es eine Möglichkeit, ich kann die Vorlage aus der ng-include binden so funktioniert es auf der ersten ng-repeat?ng-repeat mit ng-include funktioniert nicht

<div ng-repeat="item in items"> 
    <div ng-include src="'views/template.html'"></div> 
</div> 

Zum Beispiel, wenn mein ng-repeat 10 Elemente enthält, dann wird das erste Element, das gemacht wird, wird nur die leere Vorlage sein. Die Punkte 2-10 werden so wiedergegeben, wie sie sein sollten. Was mache ich falsch?

+0

und Sie können nicht platzieren ng-repeat in die Vorlage dieses dann tun? – daremachine

+0

Es gibt keinen Unterschied zwischen erster und anderer Iteration. Sehen Sie sich Inhalt für Artikel-Array. Das Problem könnte da sein. – Chandermani

+0

versuchen, diese http://stackoverflow.com/questions/14112663/angularjs-ng-repeat-with-ng-include-not-rendering – daremachine

Antwort

26

Stellen Sie zuerst sicher, dass die Daten, die im ersten Index der Elemente enthalten sind, tatsächlich die gewünschten Daten haben.

Eine mögliche Lösung für Ihr Problem einfach wäre, den ersten Index der ng-Wiederholung nicht zeigen:

<div ng-repeat="item in items" ng-show="!$first"> 
    <div ng-include src="'views/template.html'"></div> 
</div> 

Dadurch wird die Wurzel des Problems nicht wirklich kann angehen, aber es kann immer noch Ihre Anwendung erhalten etwas mehr wie das, was Sie erwarten.


Eine andere mögliche Lösung:

<div ng-repeat="item in items" ng-include="'views/template.html'"></div> 

siehe Beispiel hier:

http://plnkr.co/edit/Yvd73HiFS8dXvpvpEeFu?p=preview


Eine weitere mögliche Lösung nur für eine gute Maßnahme:

Verwenden einer Komponente:

html:

<div ng-repeat="item in items"> 
    <my-include></my-include> 
</div> 

js:

angular.module("app").directive("myInclude", function() { 
return { 
    restrict: "E", 
    templateUrl: "/views/template.html" 
} 
}) 
+0

Danke für Ihre Lösungen. Es scheint, dass es funktioniert, wenn ich zu der Seite navigiere, indem ich auf einen "Link" klicke, der "$ location.path (route);" verwendet. Wenn ich jedoch auf der Seite auf Aktualisieren klicke, habe ich das ursprüngliche Problem, bei dem das erste Element in der ng-Wiederholung nicht ausgefüllt ist (keines der Tags im ersten Element ist ausgefüllt). –

+0

Ja, nichts davon funktioniert mit AngularJS 1.26 – Romain

+0

@RomainFournereau Ich stimme nicht zu. http://plnkr.co/edit/uBbXMlI5MYEcjIfXXeQT?p=preview – xyclos

1

I in das gleiche Problem lief, und schließlich herausgefunden, dass das erste Element in der Zeit nicht abgerufen worden und kompiliert für die erste ng-repeat Iteration. Mit $templateCache wird das Problem behoben.


Sie können Ihre Vorlage in einem Script-Tag-Cache:

<script type="text/ng-template" id="templateId.html"> 
    <p>This is the content of the template</p> 
</script> 


Oder in Ihrer Lauffunktion der App:

angular.module("app").run(function($http, $templateCache) { 
    $http.get("/views/template.html", { cache: $templateCache }); 
}); 


Sie auch $templateCache in Ihrer Richtlinie verwenden können, obwohl es ein bisschen schwieriger zu installieren ist. Wenn Ihre Vorlagen dynamisch sind, würde ich empfehlen, einen Vorlagen-Cache-Dienst zu erstellen.Diese Frage SO hat einige gute Beispiele für caching innerhalb einer Richtlinie und einen Dienst:

Using $http and $templateCache from within a directive doesn't return results

+0

Ich finde, dass $ zuerst und $ last immer für mich auf allen wiederholten Bereichen wahr bewerten - denken Sie, dass Ihr Problem mit meinem verwandt ist? Auch $ middle und $ index funktionieren gut - also verwende ich die Scope-Variablen richtig - jemand anderes? – landed

1

Mit einer Richtlinie für mich gearbeitet: https://stackoverflow.com/a/24673257/188926

In Ihrem Fall:

1) definieren ein Richtlinie:

angular.module('myApp') 
    .directive('mytemplate', function() { 
    return { 
     templateUrl: 'views/template.html' 
    }; 
    }); 

2) Ihre neue Richtlinie verwenden:

<mytemplate /> 

... oder wenn Sie concerned über HTML-Validierung sind:

<div mytemplate></div>