Возможно ли вставить элемент между элементами, создаваемыми ng-repeat?
Добрый день.
Есть задача: получить код примерно такой структуры: <div class="row"> <div class="col-sm-6 col-md-4">эти</div> <div class="col-sm-6 col-md-4">блоки</div> <div class="clearfix visible-sm"></div> <div class="col-sm-6 col-md-4">могут</div> <div class="clearfix visible-md"></div> <div class="col-sm-6 col-md-4">быть</div> <div class="clearfix visible-sm"></div> <div class="col-sm-6 col-md-4">разной</div> <div class="col-sm-6 col-md-4">высоты</div> </div> Здесь блоки <div class="col-sm-6 col-md-4"> содержат контент, и их логично создавать при помощи ng-repeat: <div class="row"> <div class="col-sm-6 col-md-4" ng-repeat="item in content">{{item}}</div> </div> При этом блоки с классом clearfix выполняют исключительно оформительскую задачу, контента не содержат, и на уровне шаблона должны внедряться через определённое количество блоков с контентом (через три на десктопах и через два на планшетах). То есть, так я например достигаю нужного результата в django-шаблоне: Код:
<div class="row"> Возможно ли вообще в шаблоне в цикле ставить разделители между элементами, а не внутри их? |
Простите, вопрос действительно глупый, поскольку решается более вдумчивым чтением документации. Но если у кого ещё возникнет такой же, вот работающий пример:
<div class="row"> <article class="col-md-4 col-sm-6" ng-repeat-start="article in productsData.ARTICLES"> <figure class="preview-image"> <img ng-src="{{article.PREVIEW_PICTURE.src}}"> </figure> <hgroup> <div class="section-name">{{productsData.SECTIONS[article.SECTION_ID].NAME}}</div> <h4>{{article.NAME}}</h4> </hgroup> <div class="article-text">{{article.PREVIEW_TEXT}}</div> </article> <div class="clearfix hide" ng-repeat-end ng-class="separatorClasses($index)"></div> </div> где функция separatorClasses определена в контроллере: $scope.separatorClasses = function(index){ var classes = [], i = index+1 if(i%2==0) { classes.push('visible-sm') } if(i%3==0) { classes.push('visible-md') classes.push('visible-lg') } return classes } Так пример, конечно, работает, но сама идея css-классов в контроллере мне совсем не нравится, грубо нарушает MVC на мой взгляд. Но как поступить правильнее? |
К сожалению, конкретного решения, привести не могу (только недавно начал изучать фреймворк).
По-моему, решение уже кроется в Вашем же ответе, про то, что манипулировать DOMом рекомендуется не из контроллеров, а из директив. Например, обернуть DIVы ng-repeat в элемент-директиву, и реализовать в ней вставку необходимых оформительских DIVов. Или, если брать пример выше с ng-repeat-end, то встроить проверку классов в выражение директивы. ng-class="{'visible-sm': !(($index+1) % 2),'visible-md': !(($index+1) % 3)}" |
Вставка разделителей через директиву
<script> angular.module('myApp', []) /* Код директивы */ .directive('divider', [ function () { return { link: function ( scope, elem, attr) { var si = scope.$index + 1; if( !(si % 2) ) angular.element(elem).after('<div class="clearfix visible-sm">--SM divider--</div>'); if( !(si % 3) ) angular.element(elem).after('<div class="clearfix visible-md">--MD divider--</div>'); } }; }]); </script> /* Репитер с нашей директивой */ <div ng-repeat="i in [0,1,2,3,4,5,6,7]" divider> Item {{i}} </div> Код на Plunker http://embed.plnkr.co/bFjfAQTAGQL8y1VEuuxb/preview |
Часовой пояс GMT +3, время: 08:37. |