У меня есть div, на котором я использовал ng-repeat. Он отображает список фотографий в сетке. Все это очень просто и отлично работает.
Мне нужно добавить файловый проводник, как навигация по элементам внутри сетки. Самый простой способ - узнать длину строки (количество элементов в строке), а затем выполнить простую математику, чтобы вычислить, куда переместить выделение на основе нажатой клавиши.
Проблема, с которой я сталкиваюсь, - выяснить длину линии. Это даже выполнимо?
Редактировать:
<div class="images-cq__item" ng-repeat="photo in displayedPhotos">
<div ng-class="{active: photo.selected}" id="{{photo.uuid}}" ng-click="selectionEvent({value: photo.uuid, event: $event, index: $index})">
<div class="images-cq-statut" ng-show="photo.statusCQ != 'none'">
{{photo.statusCQ}}
</div>
<div class="img-cq">
<img ng-src="{{photo.thumbPath100}}" alt="Alternate Text" />
<a href="#" class="zoom-cq" title="zoom" ng-click="zoomOpen({value: $index, event: $event})">zoom</a>
</div>
<p>
{{photo.title}}
</p>
<ul class="images-cq-tags">
<li id="{{photo.uuid}}.{{tag.value}}" ng-repeat="tag in tags" style="display:none">
<span>{{tag.name}}</span>
</li>
</ul>
</div>
ОтображаемыйФотос представляет собой простой массив с фотообъектами, полученными с сервера. Он содержит несколько ссылок (эскизы, оригиналы) и некоторую другую информацию, но я не думаю, что это актуально в этом случае.
Это то, что я получил:
JavaScript
var items = $(".images-cq__item");
var previousTop = null;
var itemsPerRow = 0;
for(var i = 0; i < items.length;i++){
var item = items.eq(i);
var offset = item.offset();
var top = offset.top;
if(!previousTop || (top == previousTop)){
previousTop = top;
itemsPerRow++;
} else{
break;
}
}
console.log(itemsPerRow); // 3
HTML
<div class="container">
<div class="images-cq__item"></div>
<div class="images-cq__item"></div>
<div class="images-cq__item"></div>
<div class="images-cq__item"></div>
<div class="images-cq__item"></div>
<div class="images-cq__item"></div>
<div class="images-cq__item"></div>
<div class="images-cq__item"></div>
<div class="images-cq__item"></div>
<div class="images-cq__item"></div>
</div>
CSS
.container{
width: 400px;
}
.images-cq__item{
width: 120px;
height: 120px;
background: green;
margin-right: 10px;
margin-bottom: 10px;
display: inline-block;
}
Вы можете использовать {{$index}}
внутри ng-repeat
См. Это Angular.js. Как подсчитать итерации ng-repeat, которые удовлетворяют настраиваемому фильтру