Cách chia dữ liệu lặp lại ng với ba cột bằng bootstrap


122

Tôi đang sử dụng ng-repeat với mã của mình, tôi có số hộp văn bản dựa trên ng-repeat. Tôi muốn căn chỉnh hộp văn bản với ba cột.

đây là mã của tôi

<div class="control-group" ng-repeat="oneExt in configAddr.ext">
    {{$index+1}}. 
    <input type="text" name="macAdr{{$index+1}}" 
           id="macAddress" ng-model="oneExt.newValue" value=""/>
</div>

1
vì vậy, giả sử bạn có chín (9) bạn muốn 1,2,3 liên tiếp hoặc trong một cột?
Gabriele Petrioli

Câu trả lời:


254

Cách tiếp cận đáng tin cậy và đúng kỹ thuật nhất là chuyển đổi dữ liệu trong bộ điều khiển. Đây là một chức năng chunk đơn giản và cách sử dụng.

function chunk(arr, size) {
  var newArr = [];
  for (var i=0; i<arr.length; i+=size) {
    newArr.push(arr.slice(i, i+size));
  }
  return newArr;
}

$scope.chunkedData = chunk(myData, 3);

Sau đó, quan điểm của bạn sẽ như thế này:

<div class="row" ng-repeat="rows in chunkedData">
  <div class="span4" ng-repeat="item in rows">{{item}}</div>
</div>

Nếu bạn có bất kỳ đầu vào nào trong ng-repeat, bạn có thể muốn hủy kết nối / nối lại các mảng khi dữ liệu được sửa đổi hoặc khi gửi. Đây là cách nó sẽ trông như thế nào $watchđể dữ liệu luôn có sẵn ở định dạng gốc, được hợp nhất:

$scope.$watch('chunkedData', function(val) {
  $scope.data = [].concat.apply([], val);
}, true); // deep watch

Nhiều người thích thực hiện điều này trong chế độ xem với bộ lọc. Điều này là có thể, nhưng chỉ nên được sử dụng cho mục đích hiển thị! Nếu bạn thêm đầu vào trong chế độ xem được lọc này, nó sẽ gây ra các vấn đề có thể được giải quyết, nhưng không đẹp hoặc đáng tin cậy .

Vấn đề với bộ lọc này là nó trả về các mảng lồng nhau mới mỗi lần. Angular đang xem giá trị trả về từ bộ lọc. Lần đầu tiên bộ lọc chạy, Angular biết giá trị, sau đó chạy lại để đảm bảo nó được thay đổi. Nếu cả hai giá trị là như nhau, chu kỳ kết thúc. Nếu không, bộ lọc sẽ kích hoạt lặp đi lặp lại cho đến khi chúng giống nhau hoặc Angular nhận ra một vòng lặp tiêu hóa vô hạn đang xảy ra và tắt. Bởi vì các mảng / đối tượng lồng nhau mới không được Angular theo dõi trước đó, nó luôn thấy giá trị trả về khác với trước đó. Để sửa các bộ lọc "không ổn định" này, bạn phải bọc bộ lọc trong một memoizechức năng. lodashcó một memoizechức năng và phiên bản mới nhất của lodash cũng bao gồm một mô-đun và biên dịch tập lệnh với hoặc .chunk chức năng, vì vậy chúng tôi có thể tạo bộ lọc này rất đơn giản bằng cách sử dụngnpmbrowserifywebpack

Ghi nhớ: chỉ hiển thị! Lọc trong bộ điều khiển nếu bạn đang sử dụng đầu vào!

Cài đặt lodash:

npm install lodash-node

Tạo bộ lọc:

var chunk = require('lodash-node/modern/array/chunk');
var memoize = require('lodash-node/modern/function/memoize');

angular.module('myModule', [])
.filter('chunk', function() {
  return memoize(chunk);
});

Và đây là một mẫu với bộ lọc này:

<div ng-repeat="row in ['a','b','c','d','e','f'] | chunk:3">
  <div class="column" ng-repeat="item in row">
    {{($parent.$index*row.length)+$index+1}}. {{item}}
  </div>
</div>

Đặt hàng theo chiều dọc

1  4
2  5
3  6

Về các cột dọc (danh sách từ trên xuống dưới) thay vì ngang (trái sang phải), việc thực hiện chính xác phụ thuộc vào ngữ nghĩa mong muốn. Danh sách phân chia không đồng đều có thể được phân phối theo nhiều cách khác nhau. Đây là một cách:

<div ng-repeat="row in columns">
  <div class="column" ng-repeat="item in row">
    {{item}}
  </div>
</div>
var data = ['a','b','c','d','e','f','g'];
$scope.columns = columnize(data, 3);
function columnize(input, cols) {
  var arr = [];
  for(i = 0; i < input.length; i++) {
    var colIdx = i % cols;
    arr[colIdx] = arr[colIdx] || [];
    arr[colIdx].push(input[i]);
  }
  return arr;
}

Tuy nhiên, cách trực tiếp và đơn giản nhất để lấy các cột là sử dụng các cột CSS :

.columns {
  columns: 3;
}
<div class="columns">
  <div ng-repeat="item in ['a','b','c','d','e','f','g']">
    {{item}}
  </div>
</div>

Cảm ơn bạn đã giúp đỡ. Nhưng sử dụng băng chuyền với biểu đồ ui trong góc không thể vẽ biểu đồ bt băng chuyền hoạt động tốt. mã của tôi là <carousel khoảng = "myInterval"> <trượt ng-repeat = "mốc quan trọng trong Milestone | split: 4" active = "slide.active"> <div class = "col-md-3" ng-repeat =" cột mốc1 trong cột mốc "> <div style =" text-align: centre; "> <div ui-chart =" data "chart-Options =" ​​chartOptions "> </ div> </ div> </ div> </ slide > </ carousel> Và tôi đã khởi tạo biến phạm vi của mình dưới dạng dữ liệu JSON.
kuppu

1
@ m59 Ngay bây giờ chức năng này hiển thị dữ liệu ở hàng a b cthứ hai hàng đầu tiên d e f. Tôi có thể hiển thị a b trong cột đầu tiên c dtrong cột thứ hai và e fcột thứ ba không? Cảm ơn

1
@ Ifch0o1 Bạn sẽ đúng nếu đó là [].concat.call([], val). Bạn phải xem xét những gì applykhông. vallà một mảng các mảng và chúng tôi muốn truyền từng mảng đó vào bên trong nó làm đối số concat. Tôi nghĩ rằng bạn đang tập trung vào bối cảnh [], đó không phải là vấn đề ở đây. Những gì chúng tôi muốn là [].concat(val[1], val[2], val[3], etc), vì vậy chúng tôi cầnapply([], val)
m59

1
@bahadir Mình cập nhật câu trả lời để rõ hơn. Kiểm tra xem điều gì xảy ra nếu bạn tạo một bộ lọc chỉ trả về []vs [[]][{}]. Mảng / đối tượng lồng nhau làm cho Angular thấy một kết quả khác nhau trên mỗi filtervà tiếp tục lặp lại tìm kiếm kết quả để giữ nguyên (ổn định).
m59

1
Bạn đang thực sự spam các bình luận :) Hãy thử nó cho chính mình. var x = [1,2,3]; var y = [1,2,3]; console.log(x === y);Kiểm tra sâu có nghĩa là xâu chuỗi và so sánh các chuỗi, điều này có rủi ro vì một đối tượng có thể không thể xâu chuỗi được hoặc kiểm tra đệ quy từng thuộc tính riêng lẻ. Tôi nghĩ Angular có thể thực hiện điều đó cho các bộ lọc, nhưng tôi chắc chắn có lý do chính đáng mà họ đã không làm. Có lẽ bởi vì họ chủ yếu dự định các bộ lọc để sửa đổi đơn giản một tập dữ liệu, chứ không phải là một đại tu hoàn chỉnh với các thay đổi về cấu trúc.
m59

64

Giải pháp này rất đơn giản:

JSON:

[{id:"1",name:"testA"},{id:"2",name:"test B"},{id:"3",name:"test C"},{id:"4",name:"test D"},{id:"5",name:"test E"}]

HTML:

<div ng-controller="MyCtrl">
  <table>
    <tr ng-repeat="item in items" ng-switch on="$index % 3">
      <td ng-switch-when="0">
        {{items[$index].id}} {{items[$index].name}}
      </td>
      <td ng-switch-when="0">
        <span ng-show="items[$index+1]">
          {{items[$index+1].id}} {{items[$index+1].name}}
        </span>
      </td>
      <td ng-switch-when="0">
        <span ng-show="items[$index+2]">    
          {{items[$index+2].id}} {{items[$index+2].name}}
        </span>
      </td>
    </tr>
  </table>
</div>

DEMO trong FIDDLE

nhập mô tả hình ảnh ở đây


3
Câu trả lời tốt nhất! Và làm những gì cần thiết với chỉ thị bản địa! Xin chúc mừng!
Renan Franca

1
Giải pháp này hoạt động, nhưng theo cách thực hành tốt nhất, có lẽ bạn không nên sử dụng bảng để xác định bố cục trong đánh dấu của mình :)
Dave Cooper

2
Như @DaveCooper đề cập, đây là một bố cục thay thế không có bảng: plnkr.co/edit/81oj8mHaNyfQpCmRBWO4?p=preview . Xem xét các bảng cho dữ liệu được lập bảng, nhưng nếu không, đây là cách bố trí tốt hơn cho các thiết bị di động và kích thước màn hình thay đổi.
Zymotik

1
Đây là giải pháp tốt nhất. Phải mất thời gian để tìm tất cả những điều kỳ quặc khi sử dụng một khung công tác mới nhưng ng-switch là một ơn trời
Zoran

Nếu bạn định dùng div thay vì bảng, bạn có thể đặt ng-switch-when="0"div bên ngoài một lần thay vì trên cả 3 mục.
Hans Wouters

19

Một giải pháp sạch, có thể thích ứng mà không cần thao tác dữ liệu :

HTML:

<div class="control-group" class="label"
    ng-repeat="oneExt in configAddr.ext"
    ng-class="{'new-row': startNewRow($index, columnBreak) }">
    {{$index+1}}. 
    <input type="text" name="macAdr{{$index+1}}" 
       id="macAddress{{$index}}" ng-model="oneExt.newValue" />
</div>

CSS:

.label {
    float: left;
    text-align: left;
}
.new-row {
    clear: left;
}

JavaScript:

$scope.columnBreak = 3; //Max number of colunms
$scope.startNewRow = function (index, count) {
    return ((index) % count) === 0;
};

Đây là một giải pháp đơn giản để hiển thị dữ liệu thành các hàng và cột một cách linh hoạt mà không cần phải thao tác với mảng dữ liệu bạn đang cố gắng hiển thị. Ngoài ra, nếu bạn thử thay đổi kích thước cửa sổ trình duyệt, bạn có thể thấy lưới tự động điều chỉnh theo kích thước của màn hình / div.

(Tôi cũng đã thêm hậu tố {{$ index}} vào id của bạn vì ng-repeat sẽ cố gắng tạo nhiều phần tử với cùng một id nếu bạn không.)

Một ví dụ làm việc tương tự


1
Tôi tin rằng OP muốn đánh dấu cho các hàng / cột Bootstrap của Twitter, nhưng điều này có thể hữu ích cho ai đó. Tuy nhiên, bạn cần đặt mã và giải thích trong câu trả lời của bạn. Liên kết chỉ trả lời sẽ được gỡ bỏ.
m59

@ m59 Cập nhật câu trả lời. Cảm ơn lời đề nghị
Cumulo Nimbus

1
Lớn +1 cho không yêu cầu thao tác dữ liệu . Điều này hoạt động hoàn hảo cho nhu cầu của tôi muốn tách dữ liệu trong một khoảng bằng cách sử dụng ng-repeat thành 2 cột để phương thức Bootstrap của tôi không quá dài! Tôi đã ngạc nhiên khi cách này đơn giản để thực hiện! <span ng-repeat="z in waiverModalLinks" ng-class="{'new-row':startNewRow($index, columnBreak)}" class="{{z.id}}"><a href="{{z.link}}{{z.title}}">{{z.title}}</a></span>Đó là bên trong 'phương thức-cơ thể'.
Christine268

15

Câu trả lời của m59 là khá tốt. Một điều tôi không thích về nó là nó sử dụng divs cho những gì có khả năng là dữ liệu cho một bảng.

Vì vậy, kết hợp với bộ lọc của m59 (trả lời ở đâu đó ở trên), đây là cách hiển thị nó trong bảng.

<table>
    <tr class="" ng-repeat="rows in foos | chunk:2">
        <td ng-repeat="item in rows">{{item}}</td>
    </tr>
</table>

7

Sau đây là một cách đơn giản hơn:

<table>
    <tr ng-repeat="item in lists" ng-hide="$index%2!==0">
        <td>
            <label>{{ lists[$index].name}}</label>
        </td>
        <td ng-hide="!lists[$index+1]">
            <label>{{ lists[$index+1].name}}</label>
        </td>
    </tr>
</table>

Câu trả lời của Cumulo Nimbus rất hữu ích cho tôi nhưng tôi muốn lưới này được bao bọc bởi một div có thể hiển thị thanh cuộn khi danh sách quá dài.

Để đạt được điều này, tôi đã thêm style="height:200px; overflow:auto"vào một div xung quanh bảng làm cho nó hiển thị dưới dạng một cột.

Bây giờ làm việc cho chiều dài mảng của một.


khi chỉ có 1 mục trong mảng thì nó sẽ không hiển thị hàng đầu tiên. để khắc phục sự thay đổi này ng-hide="$index%2!==0"
Anuj Pandey

4

Tôi có một chức năng và lưu trữ nó trong một dịch vụ để tôi có thể sử dụng nó trên ứng dụng của mình:

Dịch vụ:

app.service('SplitArrayService', function () {
return {
    SplitArray: function (array, columns) {
        if (array.length <= columns) {
            return [array];
        };

        var rowsNum = Math.ceil(array.length / columns);

        var rowsArray = new Array(rowsNum);

        for (var i = 0; i < rowsNum; i++) {
            var columnsArray = new Array(columns);
            for (j = 0; j < columns; j++) {
                var index = i * columns + j;

                if (index < array.length) {
                    columnsArray[j] = array[index];
                } else {
                    break;
                }
            }
            rowsArray[i] = columnsArray;
        }
        return rowsArray;
    }
}

});

Điều khiển:

$scope.rows   = SplitArrayService.SplitArray($scope.images, 3); //im splitting an array of images into 3 columns

Đánh dấu:

 <div class="col-sm-12" ng-repeat="row in imageRows">
     <div class="col-sm-4" ng-repeat="image in row">
         <img class="img-responsive" ng-src="{{image.src}}">
     </div>
 </div>

Mặc dù điều này thật tuyệt, nhưng nó không có ích khi sử dụng các bộ lọc khác như orderBy hoặc bộ lọc.
Robbie Smith

2

Cách tiếp cận của tôi là một hỗn hợp của mọi thứ.

Mục tiêu của tôi là có một lưới thích ứng với kích thước màn hình. Tôi muốn 3 cột cho lg, 2 cột cho smmd, và 1 cột xs.

Đầu tiên, tôi tạo hàm scope sau, sử dụng góc $window dịch vụ :

$scope.findColNumberPerRow = function() {
    var nCols;
    var width = $window.innerWidth;

    if (width < 768) {
        // xs
        nCols = 1;
    }
    else if(width >= 768 && width < 1200) {
         // sm and md
         nCols = 2
    } else if (width >= 1200) {
        // lg
        nCols = 3;
    }
    return nCols;
};

Sau đó, tôi đã sử dụng lớp được đề xuất bởi @Cumulo Nimbus:

.new-row {
    clear: left;
}

Trong div có chứa ng-repeat, tôi đã thêm resizablechỉ thị, như được giải thích trong trang này , để mỗi khi cửa sổ được thay đổi kích thước, $windowdịch vụ góc được cập nhật với các giá trị mới.

Cuối cùng, trong div lặp đi lặp lại, tôi có:

ng-repeat="user in users" ng-class="{'new-row': ($index % findColNumberPerRow() === 0) }"

Xin vui lòng, cho tôi biết bất kỳ sai sót trong phương pháp này.

Hy vọng nó có thể hữu ích.


2

Một mẹo đơn giản với CSS "Clearfix" được Bootstrap khuyên dùng:

<div class="row">
      <div ng-repeat-start="value in values" class="col-md-4">
        {{value}}
      </div>
      <div ng-repeat-end ng-if="$index % 3 == 0" class="clearfix"></div>
</div>

Nhiều ưu điểm: Hiệu quả, nhanh chóng, sử dụng các đề xuất Boostrap, tránh các vấn đề tiêu hóa $ có thể xảy ra và không làm thay đổi mô hình Angular.


1

Ví dụ này tạo ra một bộ lặp lồng nhau trong đó dữ liệu bên ngoài bao gồm một mảng bên trong mà tôi muốn liệt kê trong hai cột. Khái niệm này sẽ đúng cho ba hoặc nhiều cột.

Trong cột bên trong, tôi lặp lại "hàng" cho đến khi đạt đến giới hạn. Giới hạn được xác định bằng cách chia chiều dài của mảng các mục cho số cột mong muốn, trong trường hợp này là hai. Phương thức phân chia nằm trên bộ điều khiển và được truyền chiều dài mảng hiện tại dưới dạng tham số. Hàm JavaScript lát (0, mảng.length / cộtCount) sau đó áp dụng giới hạn cho bộ lặp.

Bộ lặp cột thứ hai sau đó được gọi và lặp lại lát (mảng.length / cộtCount, mảng.length) tạo ra nửa sau của mảng trong cột hai.

<div class="row" ng-repeat="GroupAccess in UsersController.SelectedUser.Access" ng-class="{even: $even, odd: $odd}">
    <div class="col-md-12 col-xs-12" style=" padding-left:15px;">
        <label style="margin-bottom:2px;"><input type="checkbox" ng-model="GroupAccess.isset" />{{GroupAccess.groupname}}</label>
    </div>
    <div class="row" style=" padding-left:15px;">
        <div class="col-md-1 col-xs-0"></div>
        <div class="col-md-3 col-xs-2">
            <div style="line-height:11px; margin-left:2px; margin-bottom:2px;" ng-repeat="Feature in GroupAccess.features.slice(0, state.DivideBy2(GroupAccess.features.length))">
                <span class="GrpFeature">{{Feature.featurename}}</span>
            </div>
        </div>
        <div class="col-md-3 col-xs-2">
            <div style="line-height:11px; margin-left:2px; margin-bottom:2px;" ng-repeat="Feature in GroupAccess.features.slice( state.DivideBy2(GroupAccess.features.length), GroupAccess.features.length )">
                <span class="GrpFeature">{{Feature.featurename}}</span>
            </div>
        </div>
        <div class="col-md-5 col-xs-8">
        </div>
    </div>
</div>


// called to format two columns
state.DivideBy2 = function(nValue) {
    return Math.ceil(nValue /2);
};

Hy vọng điều này sẽ giúp nhìn vào giải pháp theo một cách khác. (PS đây là bài viết đầu tiên của tôi ở đây! :-))


1

Tôi sửa mà không có .row

<div class="col col-33 left" ng-repeat="photo in photos">
   Content here...
</div>

và css

.left {
  float: left;
}

1

Đây là một cách dễ dàng để làm điều đó. Đó là thủ công hơn và kết thúc với đánh dấu lộn xộn. Tôi không khuyến khích điều này, nhưng có những tình huống có thể hữu ích.

Đây là một liên kết fiddle http://jsfiddle.net/m0nk3y/9wcbpydq/

HTML:

<div ng-controller="myController">
    <div class="row">
        <div class="col-sm-4">
            <div class="well">
                <div ng-repeat="person in people = data | limitTo:Math.ceil(data.length/3)">
                {{ person.name }}
                </div>
            </div>
        </div>
        <div class="col-sm-4">
            <div class="well">
                <div ng-repeat="person in people = data | limitTo:Math.ceil(data.length/3):Math.ceil(data.length/3)">
                {{ person.name }}
                </div>
            </div>
        </div>
        <div class="col-sm-4">
            <div class="well">
                <div ng-repeat="person in people = data | limitTo:Math.ceil(data.length/3):Math.ceil(data.length/3)*2">
                {{ person.name }}
                </div>
            </div>
        </div>
    </div>
</div>

JS:

var app = angular.module('myApp', []);

app.controller('myController', function($scope) {

    $scope.Math = Math;
    $scope.data = [
        {"name":"Person A"},
        ...
    ];
});

Thiết lập này yêu cầu chúng tôi sử dụng một số Toán học khi đánh dấu: /, vì vậy bạn sẽ cần tiêm Toán bằng cách thêm dòng này: $scope.Math = Math;


1

Tất cả những câu trả lời này dường như ồ ạt.

Cho đến nay, phương pháp đơn giản nhất là thiết lập các div đầu vào trong bootstrap cột col-md-4, sau đó bootstrap sẽ tự động định dạng nó thành 3 cột do tính chất 12 cột của bootstrap:

<div class="col-md-12">
    <div class="control-group" ng-repeat="oneExt in configAddr.ext">
        <div class="col-md-4">
            <input type="text" name="macAdr{{$index}}"
                   id="macAddress" ng-model="oneExt.newValue" value="" />
        </div>
    </div>
</div>

1
<div class="row">
  <div class="col-md-4" ng-repeat="remainder in [0,1,2]">
    <ul>
      <li ng-repeat="item in items" ng-if="$index % 3 == remainder">{{item}}</li>
    </ul>
  </div>
</div>

0

Dựa trên câu trả lời rất hay của m59. Tôi thấy rằng các đầu vào mô hình sẽ bị mờ nếu chúng thay đổi, vì vậy bạn chỉ có thể thay đổi một ký tự một lần. Đây là một cái mới cho danh sách các đối tượng cho bất cứ ai cần nó:

EDIT Cập nhật để xử lý nhiều bộ lọc trên một trang

app.filter('partition', function() {
  var cache = {}; // holds old arrays for difference repeat scopes
  var filter = function(newArr, size, scope) {
    var i,
      oldLength = 0,
      newLength = 0,
      arr = [],
      id = scope.$id,
      currentArr = cache[id];
    if (!newArr) return;

    if (currentArr) {
      for (i = 0; i < currentArr.length; i++) {
        oldLength += currentArr[i].length;
      }
    }
    if (newArr.length == oldLength) {
      return currentArr; // so we keep the old object and prevent rebuild (it blurs inputs)
    } else {
      for (i = 0; i < newArr.length; i += size) {
        arr.push(newArr.slice(i, i + size));
      }
      cache[id] = arr;
      return arr;
    }
  };
  return filter;
}); 

Và đây sẽ là cách sử dụng:

<div ng-repeat="row in items | partition:3:this">
  <span class="span4">
    {{ $index }}
  </span>
</div>

Theo như tôi có thể nói, điều này sẽ hoạt động hầu hết thời gian nhưng logic bộ nhớ đệm đó trông không hoàn toàn đáng tin cậy và vượt qua trong phạm vi là khó xử. Tôi thực sự khuyên bạn chỉ nên lọc trong bộ điều khiển khi cần đầu vào. Dù sao đó cũng là cách tiếp cận đúng về mặt kỹ thuật.
m59

0

Tôi mới sử dụng bootstrap và angularjs, nhưng điều này cũng có thể tạo Array trên 4 mục thành một nhóm, kết quả sẽ gần như 3 cột. Thủ thuật này sử dụng nguyên tắc ngắt dòng bootstrap.

<div class="row">
 <div class="col-sm-4" data-ng-repeat="item in items">
  <div class="some-special-class">
   {{item.XX}}
  </div>
 </div>
</div>

0

Lodash có một phương thức chunk tích hợp sẵn mà cá nhân tôi sử dụng: https://lodash.com/docs#chunk

Dựa trên điều này, mã điều khiển có thể trông như sau:

$scope.groupedUsers = _.chunk( $scope.users, 3 )

Xem mã:

<div class="row" ng-repeat="rows in groupedUsers">
  <div class="span4" ng-repeat="item in rows">{{item}}</div>
</div>

0

Một cách khác được đặt thành width:33.33%; float:leftdiv trình bao bọc như thế này:

<div ng-repeat="right in rights" style="width: 33.33%;float: left;">
    <span style="width:60px;display:inline-block;text-align:right">{{$index}}</span>
    <input type="number" style="width:50px;display:inline-block" ">
</div>

0

Tôi thấy mình trong một trường hợp tương tự, muốn tạo các nhóm hiển thị gồm 3 cột mỗi cột. Tuy nhiên, mặc dù tôi đang sử dụng bootstrap, tôi đã cố tách các nhóm này thành các div cha khác nhau. Tôi cũng muốn làm một cái gì đó hữu ích chung chung.

Tôi đã tiếp cận nó với 2 ng-repeatnhư dưới đây:

<div ng-repeat="items in quotes" ng-if="!($index % 3)">
  <div ng-repeat="quote in quotes" ng-if="$index <= $parent.$index + 2 && $index >= $parent.$index">
                ... some content ...
  </div>
</div>

Điều này giúp dễ dàng thay đổi thành một số cột khác nhau và tách ra thành một số div cha.


0

Chỉ trong trường hợp ai đó muốn có Angular 7 (và phiên bản cao hơn) ở đây là một ví dụ tôi đã sử dụng trong một trong các ứng dụng của mình:

HTML:

                   <div class="container-fluid">
                    <div class="row" *ngFor="let reports of chunkData; index as i">
                        <div *ngFor="let report of reports" class="col-4 col-sm-4"
                            style="border-style:solid;background-color: antiquewhite">{{report}}</div>
                    </div>
                </div>

.TS

export class ConfirmationPageComponent implements OnInit {
  chunkData = [];
  reportsArray = ["item 1", "item 2", "item 3", "item 4", "item 5", "item 6"];
  
  constructor() {}

  ngOnInit() {
    this.chunkData = this.chunk(this.reportsArray, 3);
  }

  chunk(arr, size) {
    var newArr = [];
    for (var i = 0; i < arr.length; i += size) {
      newArr.push(arr.slice(i, i + size));
    }
    return newArr;
  }
}

Đây là một giải pháp tuyệt vời để tự động tạo các cột / hàng mới tùy thuộc vào số lượng mục bạn lặp từ cơ sở dữ liệu. Cảm ơn!


-1

câu trả lời này là câu hỏi làm thế nào để có được 1,2,3 trong một cột. - được hỏi bởi kuppu ngày 8 tháng 2 năm14 lúc 13:47

mã angularjs:

function GetStaffForFloor(floor) {
    var promiseGet = Directory_Service.getAllStaff(floor);
    promiseGet.then(function (pl) {
        $scope.staffList = chunk(pl.data, 3); //pl.data; //
    },
    function (errorOD) {
        $log.error('Errored while getting staff list.', errorOD);
    });
}
function chunk(array, columns) {
    var numberOfRows = Math.ceil(array.length / columns);

    //puts 1, 2, 3 into column
    var newRow = []; //array is row-based.
    for (var i = 0; i < array.length; i++) {
        var columnData = new Array(columns);
        if (i == numberOfRows) break;
        for (j = 0; j < columns; j++)
        {
            columnData[j] = array[i + numberOfRows * j];
        }
        newRow.push(columnData); 
    }
    return newRow;

    ////this works but 1, 2, 3 is in row
    //var newRow = [];
    //for (var i = 0; i < array.length; i += columns) {
    //    newRow.push(array.slice(i, i + columns)); //push effectively does the pivot. array is row-based.
    //}
    //return newRow;
};

Xem mã (lưu ý: sử dụng bootstrap 3):

<div class="staffContainer">
    <div class="row" ng-repeat="staff in staffList">
        <div class="col-md-4" ng-repeat="item in staff">{{item.FullName.length > 0 ? item.FullName + ": Rm " + item.RoomNumber : ""}}</div>
    </div>
</div>

-1

Mã này sẽ giúp căn chỉnh các thành phần với ba cột trong chế độ lg và md, hai cột ở chế độ sm và cột đơn là chế độ xs

<div class="row">
<div ng-repeat="oneExt in configAddr.ext">
    <div class="col-xs-12 col-sm-6 col-md-4 col-lg-4">
        {$index+1}}. 
        <input type="text" name="macAdr{{$index+1}}" 
       id="macAddress" ng-model="oneExt.newValue" value=""/>
    </div>
</div>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.