3

Когда ng-repeat имеет динамический ng-include с переменными, он не принимает переменные должным образом.ng-repeat с динамической ошибкой ng-include и шаблоном.

См. Это plunker.

Основной HTML код

<table style> 
    <tr> 
    <th>Student</th> 
    <th>Teacher</th> 
    </tr> 
    <tbody ng-repeat="val in data"> 
    <tr> 
     <td> 
     <div ng-include src="'profile.html'" onLoad="profile=val.student"></div> 
     </td> 
     <td> 
     <div ng-include src="'profile.html'" onLoad="profile=val.teacher"></div> 
     </td> 
    </tr> 
    </tbody> 
</table> 

profile.html код

<span>Id - {{profile.id}}</span> 
<span>Name - {{profile.name}}</span> 

Вы можете увидеть на ссылке без нг-включить это работает идеально.

P.S. Это прототип того, что я на самом деле пытаюсь достичь. В основном у меня проблема с переменными, используемыми в динамическом ng-include, присутствующем в ng-repeat.

Я проверил похожие вопросы, как показано ниже, но не получил ответов.

123

+0

Ваше высказывание, что вы не можете видеть данные в соответствии с нг-включают в себя право ?? –

+0

@SaEChowdary: Да –

+0

ng-include создает «новую область». https://github.com/angular/angular.js/wiki/Understanding-Scopes#ng-include. Проблема здесь в том, что сначала вы устанавливаете параметр = val.student, тогда profile = val.teacher. профиль становится переоцененным. Вы пытались создать директиву с областью выделения. Так что вам не нужно использовать как ng-include, так и ng-if. –

ответ

2

Директива ng-include не создает новый объект $scope, но образцово наследует его, так что ваш profile переписывается с другим значением.

Итак, сначала вы говорите profile=theStudent, а затем вы переписываете его profile=theTeacher, поэтому в обоих шаблонах он всегда устанавливается учителем.

Существует немного «хак», чтобы исправить это, добавив ng-if="true", который создает новый объект $scope:

<tbody ng-repeat="val in data"> 
    <tr> 
     <td> 
      <div ng-include src="'profile.html'" 
       onLoad="profile=val.student" 
       ng-if="true"></div> 
     </td> 
     <td> 
      <div ng-include src="'profile.html'" 
       onLoad="profile=val.teacher" 
       ng-if="true"></div> 
     </td> 
    </tr> 
</tbody> 

См this updated plunker

+0

Это прекрасно работает. Есть ли способ без взлома? @devqon –

+0

@SomnathMuluk да, см. мой ответ. –

0

Вы также можете создать второй HTML, как profile.html и после того, как ваш код будет, как:

index.html

<tbody ng-repeat="val in data"> 
     <tr> 
      <td> 
      <div ng-include src="'profile.html'" onLoad="profile=val.student"></div> 
      </td> 
      <td> 
      <div ng-include src="'profile2.html'" onLoad="profile2=val.teacher"></div> 
      </td> 
     </tr> 
     </tbody> 

profile2.html

<span>Id - {{profile2.id}}</span> 
<span>Name - {{profile2.name}}</span> 
+0

Это заставит вас поддерживать 2 шаблона с одинаковым контентом – devqon

+0

Я не хочу иметь 2 шаблона. Это прототип. У меня длинный html в шаблоне. –

1

Вместо того, чтобы использовать как ng-include и ng-if директивы добиться того, что вы хотите, вы можете создать простую profile директивы с изолированной сферой и передавать данные в него.

plucker

angular.module('ng-include-example', []). 
controller("MainCtrl", function($scope) { 

    var data = [ 
     { 
     "student" : { "id":11, "name": "John" }, 
     "teacher" : { "id" : 21, "name": "Mike"} 
     }, 
     { 
     "student" : { "id":12, "name": "Tony" }, 
     "teacher" : { "id" : 22, "name": "Jack"} 
     }, 
     { 
     "student" : { "id":13, "name": "Cris" }, 
     "teacher" : { "id" : 23, "name": "Anthony"} 
     }, 
     { 
     "student" : { "id":14, "name": "Greg" }, 
     "teacher" : { "id" : 24, "name": "Reva"} 
     } 

    ]; 

    $scope.data = data; 

}) 
.directive("profile", function(){ 
    return{ 
    restrict:'E', 
    scope:{ 
     profile: "=" 
    }, 
    templateUrl: "profile.html" 
    } 
}); 

<div> 
    Using Directive 
    <table style> 
     <tr> 
     <th>Student</th> 
     <th>Teacher</th> 
     </tr> 
     <tbody ng-repeat="val in data"> 
     <tr> 
      <td> 
      <profile profile = "val.student"></profile> 
      </td> 
      <td> 
      <profile profile = "val.teacher"></profile> 
      </td> 
     </tr> 
     </tbody> 
    </table> 
    </div> 

 Смежные вопросы

  • Нет связанных вопросов^_^