Использование Angular ng-repeat для создания вложенного списка

#javascript #angularjs #angularjs-ng-repeat

#javascript #angularjs #angularjs-ng-repeat

Вопрос:

Я хочу создать список слоев и вложенный список подслоев для каждого слоя, повторив этот объект с помощью ng-repeat .

 var lyrslist = [
    { layername: "Base Maps", layertype: "layer" },
    { layername: "Open Street Map", layertype: "sublayer" },
    { layername: "Designated Sites", layertype: "layer" },
    { layername: "Ancient Woodlands", layertype: "sublayer" },
    { layername: "Conservation Areas", layertype: "sublayer" },
    { layername: "Listed Buildings", layertype: "sublayer" }
];
 

HTML

 <h5>Layers</h5>
<ul ng-repeat="lyr in lyrslist">
  <li ng-if="lyr.layertype === 'layer'" >
    Layer {{lyr.layername}}
    <ul>
      <li ng-if="lyr.layertype === 'sublayer'"> 
       Sub Layer {{lyr.layername}}
     </li>
   </ul>
 </li>
</ul>
 

В результате получается, что отображаются только слои. Кажется, это ng-repeat не переходит каскадом к следующему <ul> . Я попытался поместить ng-repeat внутрь <ul> тега, но это только весь список, а не только требуемые подслои.

Это результат, который я пытаюсь получить:

 Layers
- Layer Base Maps
    - Sub Layer Open Street Map

- Layer Designated Sites
    - Sub Layer Ancient Woodlands
    - Sub Layer Conservation Areas
    - Sub Layer Listed Buildings
 

Комментарии:

1. проверьте мой ответ

2. Вы должны переделать свой список, потому что он должен выглядеть следующим образом: [{ layername:"Base Maps", layertype:"layer", sublayer: [layername:"Open Street Map", layertype:"sublayer"]}] . Тогда вы сможете легко сгенерировать представление. Проверьте мой ответ ниже. Спасибо.

Ответ №1:

Я думаю, вы ищете это:

Вы должны перепроектировать свой объект для лучшего результата. У меня есть включить подслой внутри слоя. Вот почему вы можете легко отобразить дополнительный слой в поле зрения.

 var app = angular.module('app',[])
app.controller('ctrl',function($scope){
var lyrslist = [{ layername:"Base Maps",  layertype:"layer"},  {layername:"Open Street Map",  layertype:"sublayer"}, { layername:"Designated Sites",  layertype:"layer"}, { layername:"Ancient Woodlands",  layertype:"sublayer"}, { layername:"Conservation Areas",  layertype:"sublayer"}, { layername:"Listed Buildings",  layertype:"sublayer"}];

var newList = []; var count = 0; 
angular.forEach(lyrslist, function(value, key) {
	if(value.layertype=='layer'){
  		this.push(value);
  		this[count].sub = []; //define sub layer inside layer
  		count  ;
  	}else{
  		this[count-1].sub.push(value); //assign sub layer inside layer
  	}
}, newList);
//console.log(newList);
$scope.lyrslist = newList;
  
  
}); 
 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="app" ng-controller="ctrl">
        <ul>
            <li ng-repeat="lyr in lyrslist">
                Layer: {{lyr.layername}}
              <ul>
                  <li ng-repeat="sublyr in lyr.sub"> 
                     SubLayer: {{sublyr.layername}}
                 </li>
              </ul>
            </li>
    </ul>
</div> 

Комментарии:

1. О, извините @Robert, название слоя не появилось из-за моей маленькой ошибки. Проверьте это сейчас.

2. @AHJeebon Это потрясающее решение!! Воссоздание нового списка массивов. было бы проще, если бы список массивов имел подуровень в качестве другого свойства:)

3. @AHJeebon Я согласен, это потрясающе. Спасибо!