3 열마다 부트 스트랩 행 클래스를 주입하는 올바른 패턴을 찾고 있습니다. cols에는 고정 높이가 없기 때문에 필요합니다 (고정하고 싶지 않습니다). 그래서 내 디자인이 깨집니다!
내 코드는 다음과 같습니다.
<div ng-repeat="product in products">
<div ng-if="$index % 3 == 0" class="row">
<div class="col-sm-4" >
...
</div>
</div>
</div>
그러나 각 행에 하나의 제품 만 표시됩니다. 최종 결과로 원하는 것은 다음과 같습니다.
<div class="row">
<div class="col-sm4"> ... </div>
<div class="col-sm4"> ... </div>
<div class="col-sm4"> ... </div>
</div>
<div class="row">
<div class="col-sm4"> ... </div>
<div class="col-sm4"> ... </div>
<div class="col-sm4"> ... </div>
</div>
ng-repeat 패턴으로 만이 작업을 수행 할 수 있습니까 (지시문 또는 컨트롤러 없음)? 워드 프로세서 와 겨 반복 엔드 반복 시작 겨 소개합니다하지만 난이 사용 사례입니다 사용하는 방법을 알아낼 수 없습니다! 나는 이것이 우리가 부트 스트랩 템플릿에서 자주 사용하는 것이라고 느낍니다! ? 감사
답변
가장 많이 득표 한 답변은 효과적이지만 제가 각도 방식이라고 생각하는 것이 아니며이 상황을 처리하기위한 부트 스트랩 자체 클래스를 사용하지도 않습니다. @claies가 언급했듯이 .clearfix
클래스는 이러한 상황을위한 것입니다. 제 생각에 가장 깨끗한 구현은 다음과 같습니다.
<div class="row">
<div ng-repeat="product in products">
<div class="clearfix" ng-if="$index % 3 == 0"></div>
<div class="col-sm-4">
<h2>{{product.title}}</h2>
</div>
</div>
</div>
이 구조는 제품 배열의 복잡한 인덱싱을 방지하고 깨끗한 점 표기법을 허용하며 의도 된 목적을 위해 clearfix 클래스를 사용합니다.
답변
조금 늦었지만 여전히 누군가를 도울 수 있습니다. 나는 이렇게했다 :
<div ng-repeat="product in products" ng-if="$index % 3 == 0" class="row">
<div class="col-xs-4">{{products[$index]}}</div>
<div class="col-xs-4" ng-if="products.length > ($index + 1)">{{products[$index + 1]}}</div>
<div class="col-xs-4" ng-if="products.length > ($index + 2)">{{products[$index + 2]}}</div>
</div>
답변
이 솔루션은 이미 여기에있는 솔루션 보다 훨씬 간단하며 다양한 장치 너비에 대해 다른 열 너비를 허용합니다.
<div class="row">
<div ng-repeat="image in images">
<div class="col-xs-6 col-sm-4 col-md-3 col-lg-2">
... your content here ...
</div>
<div class="clearfix visible-lg" ng-if="($index + 1) % 6 == 0"></div>
<div class="clearfix visible-md" ng-if="($index + 1) % 4 == 0"></div>
<div class="clearfix visible-sm" ng-if="($index + 1) % 3 == 0"></div>
<div class="clearfix visible-xs" ng-if="($index + 1) % 2 == 0"></div>
</div>
</div>
점을 유의 % 6
부분이 결과 열 수를 동일하게되어있다. 따라서 열 요소에 클래스가있는 경우col-lg-2
가있는 경우 6 개의 열이 있으므로 ... % 6
.
이 기술 (제외 ng-if
)은 실제로 여기에 문서화되어 있습니다. Bootstrap docs
답변
달성하고자하는 것이 유용 할 수 있지만, 훨씬 더 간단하게 간과 할 수있는 또 다른 옵션이 있습니다.
맞습니다. 높이가 고정되지 않은 열이있을 때 Bootstrap 테이블이 이상하게 작동합니다. 그러나이 문제를 해결하고 반응 형 재설정을 수행하기 위해 만들어진 부트 스트랩 클래스가 있습니다.
<div class="clearfix"></div>
플로트가 재설정되고 열이 올바른 위치로 돌아갈 수 있도록 각 새 행의 시작 전에 빈 공간을 만듭니다 .
여기에 bootply가 있습니다.
답변
제안 해주셔서 감사합니다.
완전한 설명을 위해 가자 :
-
기본적으로 AngularJS http get 쿼리는 객체를 반환합니다.
-
따라서 @Ariel Array.prototype.chunk 함수를 사용하려면 먼저 객체를 배열로 변환해야합니다.
-
그런 다음 컨트롤러 에서 청크 기능을 사용하려면 ng-repeat에 직접 사용하면 infdig 오류가 발생 합니다. 최종 컨트롤러는 다음과 같습니다.
// Initialize products to empty list $scope.products = []; // Load products from config file $resource("/json/shoppinglist.json").get(function (data_object) { // Transform object into array var data_array =[]; for( var i in data_object ) { if (typeof data_object[i] === 'object' && data_object[i].hasOwnProperty("name")){ data_array.push(data_object[i]); } } // Chunk Array and apply scope $scope.products = data_array.chunk(3); });
그리고 HTML은 다음과 같습니다.
<div class="row" ng-repeat="productrow in products">
<div class="col-sm-4" ng-repeat="product in productrow">
반면에 JSON 파일에서 {} 객체 대신 배열 []을 직접 반환하기로 결정했습니다. 이렇게하면 컨트롤러는 다음과 같이됩니다 (특정 구문 isArray : true ).
// Initialize products to empty list
$scope.products = [];
// Load products from config file
$resource("/json/shoppinglist.json").query({method:'GET', isArray:true}, function (data_array)
{
$scope.products = data_array.chunk(3);
});
HTML은 위와 동일합니다.
최적화
서스펜스의 마지막 질문은 청크 함수를 사용하여 자바 스크립트 배열을 확장하지 않고 100 % AngularJS로 만드는 방법입니다. . 궁금해 😉
ANDREW의 솔루션
@Andrew 덕분에 이제 우리는 3 개 (또는 숫자에 관계없이) 요소마다 부트 스트랩 clearfix 클래스를 추가하면 다른 블록의 높이에서 표시 문제가 수정된다는 것을 알게되었습니다.
따라서 HTML은 다음과 같습니다.
<div class="row">
<div ng-repeat="product in products">
<div ng-if="$index % 3 == 0" class="clearfix"></div>
<div class="col-sm-4"> My product descrition with {{product.property}}
그리고 컨트롤러는 제거 된 덩어리 기능으로 매우 부드럽습니다 .
// Initialize products to empty list
$scope.products = [];
// Load products from config file
$resource("/json/shoppinglist.json").query({method:'GET', isArray:true}, function (data_array)
{
//$scope.products = data_array.chunk(3);
$scope.products = data_array;
});
답변
지시 없이도 할 수 있지만 최선의 방법인지 모르겠습니다. 이렇게하려면 테이블에 표시하려는 데이터에서 배열 배열을 만들고 그 후에 2ng-repeat를 사용하여 배열을 반복해야합니다.
디스플레이 용 배열을 만들려면 제품과 같이이 함수를 사용하십시오 .chunk (3)
Array.prototype.chunk = function(chunkSize) {
var array=this;
return [].concat.apply([],
array.map(function(elem,i) {
return i%chunkSize ? [] : [array.slice(i,i+chunkSize)];
})
);
}
그런 다음 2ng-repeat를 사용하여 이와 같은 작업을 수행하십시오.
<div class="row" ng-repeat="row in products.chunk(3)">
<div class="col-sm4" ng-repeat="item in row">
{{item}}
</div>
</div>
답변
Alpar 솔루션을 기반으로 애니메이션 된 ng-repeat가있는 템플릿 만 사용합니다. 전체 및 부분적으로 비어있는 행 모두에서 작동합니다.
<div data-ng-app="" data-ng-init="products='soda','beer','water','milk','wine']" class="container">
<div ng-repeat="product in products" ng-if="$index % 3 == 0" class="row">
<div class="col-xs-4"
ng-repeat="product in products.slice($index, ($index+3 > products.length ?
products.length : $index+3))"> {{product}}</div>
</div>
</div>