[angularjs] Angular ng-repeat는 3 개 또는 4 개의 열마다 부트 스트랩 행을 추가합니다.

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>

jsfiddle


답변

이 솔루션은 이미 여기에있는 솔루션 보다 훨씬 간단하며 다양한 장치 너비에 대해 다른 열 너비를 허용합니다.

<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>

JSFiddle