Ng-repeat, первый элемент с различной директивой
Я получил следующий код:
<div ng-repeat="i in placeholders" square class="set-holder {{i.class}}" droppable="{{i.type}}"></div>
Как я делаю первый элемент с директивой bigsquare
, а остальные имеют только square
.
Я пробовал:
<div ng-repeat="i in placeholders" {{= $first ? 'big' : ''}}square class="set-holder {{i.class}}" droppable="{{i.type}}"></div>
но, к сожалению, результат:
<div ng-repeat="i in placeholders" {{= $first ? 'big' : ''}}square class="set-holder test" droppable="3"></div>
a.k.a. привязка не скомпилируется.
Ответы
Ответ 1
Вы можете использовать ng-repeat-start
и ng-repeat-end
следующим образом:
angular.module('example', [])
.controller('ctrl', function Ctrl($scope) {
$scope.items = [1, 2, 3];
})
.directive('big', function() {
return {
restrict: 'A',
link: function(scope, element, attrs) {
element.css('font-size', '30px');
}
};
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="example" ng-controller="ctrl">
<div ng-repeat-start="item in items" ng-if="$first" big>
big item {{item}}
</div>
<div ng-repeat-end ng-if="!$first">
item {{item}}
</div>
</div>
Ответ 2
Смотрите этот скрипт http://jsfiddle.net/nicolasmoise/xLfmK/2/.
Вы можете создать одну директиву, к которой вы передаете условие. В зависимости от этого условия он либо отображает квадрат, либо большой квадрат как таковой.
<div ng-repeat="repeat in repeater" condition="$first" square></div>
Примечание
Если вы не хотите изменять директивы, которые вы уже сделали, вы всегда можете иметь square
главную директиву, которая вызывает два других.
Ответ 3
Если вы не против использования другого <div>
внутри вашего <li>
, вы должны уйти от выполнения условных блоков <div>
с помощью ng-if="$index == ??"
.
Возможно, что-то вроде этого:
<div ng-repeat="i in placeholders">
<div bigsquare class="set-holder {{i.class}}" droppable="{{i.type}}" ng-if="$index == 0">
...
</div>
<div mediumsquare class="set-holder {{i.class}}" droppable="{{i.type}}" ng-if="$index == 1">
...
</div>
<div square class="set-holder {{i.class}}" droppable="{{i.type}}" ng-if="$index > 1">
...
</div>
</div>
Это немного более подробный, но он красиво отделяет шаблоны, чтобы вы могли иметь их довольно независимыми друг от друга.
Ответ 4
<!-- Here is a code sample which I used in one of my angularjs ionic apps. -->
<!-- Regular ng-repeat -->
<!-- ng-if="$first" to determine <input focus-input> or not -->
<ion-item class="item item-input item-stacked-label" ng-repeat="input in template.inputs">
<label class="input-label bh-dark" for="{{input.id}}">{{input.title}}</label>
<div class="clearfix">
<div class="bh-left">
<input ng-if="$first" focus-input id="{{input.id}}" type="{{input.type}}" placeholder="{{input.choices[0]}}" ng-model="input.answer">
<input ng-if="!$first" id="{{input.id}}" type="{{input.type}}" placeholder="{{input.choices[0]}}" ng-model="input.answer">
</div>
<div class="bh-right">
<i class="icon ion-ios-close-empty bh-icon-clear" ng-click="clearField(input.id)" ng-show="input.answer"></i>
</div>
</div>
</ion-item>