bootstrap kullanarak ng-tekrar verilerini üç sütunla nasıl böleriz


122

Kodumla ng-yineleme kullanıyorum, ng-yinelemeye dayalı 'n' metin kutusu sayısına sahibim. Metin kutusunu üç sütunla hizalamak istiyorum.

bu benim kodum

<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
Öyleyse, dokuz (9) olduğunu varsayarsak, 1,2,3'ü bir satırda mı yoksa bir sütunda mı istiyorsunuz?
Gabriele Petrioli

Yanıtlar:


255

En güvenilir ve teknik olarak doğru yaklaşım, kontrolördeki verileri dönüştürmektir. İşte basit bir yığın işlevi ve kullanımı.

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

O zaman görüşünüz şöyle görünecektir:

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

ng-repeatİçinde herhangi bir girişiniz varsa , veriler değiştirilirken veya gönderilirken dizileri büyük olasılıkla ayrıştırmak / yeniden birleştirmek isteyeceksiniz. $watchVerilerin her zaman orijinal, birleştirilmiş biçimde mevcut olması için bunun a biçiminde nasıl görüneceği aşağıda açıklanmıştır :

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

Birçok kişi bunu görünümde bir filtreyle gerçekleştirmeyi tercih eder. Bu mümkündür, ancak yalnızca görüntüleme amacıyla kullanılmalıdır! Bu filtrelenmiş görünümü içinde girdileri eklerseniz, sorunlara neden olur olabilir çözülecek ama olan tatlı veya güvenilir değildir .

Bu filtrenin sorunu, her seferinde yeni iç içe diziler döndürmesidir. Açısal, filtreden dönüş değerini izliyor. Filtre ilk kez çalıştığında, Angular değeri bilir ve ardından değiştirmenin tamamlandığından emin olmak için tekrar çalıştırır. Her iki değer de aynıysa döngü sonlandırılır. Değilse, filtre aynı oluncaya kadar tekrar tekrar patlar veya Angular sonsuz bir özet döngüsünün oluştuğunu fark eder ve kapanır. Yeni iç içe diziler / nesneler daha önce Angular tarafından izlenmediğinden, dönüş değerini her zaman öncekinden farklı olarak görür. Bu "kararsız" filtreleri düzeltmek için filtreyi bir memoizeişlevin içine sarmalısınız. lodashbir memoizeişleve sahiptir ve lodash'ın en son sürümü ayrıca bir içerir derlerchunk işlev , bu yüzden bu filtreyi çok basit bir şekilde oluşturabiliriznpmmodülleri ve betiği browserifyveya ile derlemek webpack.

Unutmayın: yalnızca görüntüleme! Girişleri kullanıyorsanız denetleyicide filtreleyin!

Lodash'ı yükleyin:

npm install lodash-node

Filtreyi oluşturun:

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);
});

Ve işte bu filtre ile bir örnek:

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

Ürünleri dikey olarak sıralayın

1  4
2  5
3  6

Yatay (soldan sağa) yerine dikey sütunlar (yukarıdan aşağıya liste) ile ilgili olarak, tam uygulama istenen anlam bilgisine bağlıdır. Eşit olmayan şekilde bölünen listeler farklı şekillerde dağıtılabilir. İşte bir yol:

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

Bununla birlikte, sütun almanın en doğrudan ve açıkça basit yolu CSS sütunlarını kullanmaktır :

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

Yardımınız için teşekkürler. Ancak ui-grafik ile açısal olarak carousel kullanmak grafiği çizemez. Bt carousel iyi çalışıyor. benim kodum <carousel interval = "myInterval"> <slide ng-tekrar = "mileStone'da dönüm noktası | split: 4" active = "slide.active"> <div class = "col-md-3" ng-tekrar = " milestone1 in milestone "> <div style =" text-align: center; "> <div ui-chart =" data "chart-options =" ​​chartOptions "> </div> </div> </div> </ slide > </carousel> Ve kapsam değişkenimi dönüm noktası JSON verisi olarak başlattım.
kuppu

1
@ m59 Şu anda bu işlev, verileri birinci satırın a b cikinci satırında görüntülüyor d e f. Ben gösterebilir miyim a b ilk sütunda c dikinci sütunda ve e füçüncü sütunda? Teşekkürler

1
@ Ifch0o1 Eğer öyleyse doğru olurdunuz [].concat.call([], val). Ne applyyapacağını düşünmelisin . valbir dizi dizisidir ve bu dizilerin her birini argüman olarak geçirmek istiyoruz concat. Sanırım bağlamına odaklanıyorsunuz, []buradaki mesele bu değil. İstediğimiz şey [].concat(val[1], val[2], val[3], etc), bu yüzden ihtiyacımız varapply([], val)
m59

1
@bahadir Cevabı daha net olması için güncelledim. Yalnızca []vs [[]]ve döndüren bir filtre yaparsanız ne olacağına bakın [{}]. İç içe geçmiş dizi / nesne, Angular'ın her biri için farklı bir sonuç görmesini filtersağlar ve sonucu aynı kalması için (kararlı hale getirmek) tekrar tekrar arar.
m59

1
Gerçekten yorumları spam yapıyorsunuz :) Kendiniz deneyin. var x = [1,2,3]; var y = [1,2,3]; console.log(x === y);Derin denetim, dizeleri dizgeye oturtmak ve karşılaştırmak anlamına gelir; bu, bir nesne dizilemez olduğu için risklidir veya her özelliği ayrı ayrı yinelemeli olarak kontrol eder. Bence Angular bunu filtreler için uygulayabilir, ama eminim yapmamalarının iyi bir nedeni vardır. Muhtemelen, temelde bir veri setinin basit bir şekilde değiştirilmesi için filtreleri amaçladıkları için, yapıdaki değişikliklerle tam bir revizyon değil.
m59

64

Bu çözüm çok basit:

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>

FIDDLE'da DEMO

görüntü açıklamasını buraya girin


3
En iyi cevap! Ve yerel yönergelerle gerekeni yapın! Congratz!
Renan Franca

1
Bu çözüm işe yarıyor, ancak en iyi uygulamalara gelince, muhtemelen biçimlendirmenizdeki düzeni tanımlamak için tablo kullanmamalısınız :)
Dave Cooper

2
@DaveCooper'ın bahsettiği gibi, işte tablo içermeyen alternatif bir düzen: plnkr.co/edit/81oj8mHaNyfQpCmRBWO4?p=preview . Tablodaki veriler için tabloları göz önünde bulundurun, ancak aksi halde bu, mobil cihazlar ve değişken ekran boyutları için daha iyi bir düzendir.
Zymotik

1
Bu, açık ara en iyi çözümdür. Yeni bir çerçeve kullanırken tüm tuhaflıkları bulmak zaman alır ancak ng-switch bir nimettir
Zoran

Bir tablo yerine div'ler için gidiyorsanız, ng-switch-when="0"3 öğenin tümü yerine bir dış div'e yerleştirebilirsiniz .
Hans Wouters

19

Veri manipülasyonu gerektirmeyen temiz, uyarlanabilir bir çözüm :

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

Bu, görüntülemeye çalıştığınız veri dizisini değiştirmeye gerek kalmadan verileri dinamik olarak satırlara ve sütunlara dönüştürmek için basit bir çözümdür. Ayrıca, tarayıcı penceresini yeniden boyutlandırmayı denerseniz, ızgaranın dinamik olarak ekran / div boyutuna uyum sağladığını görebilirsiniz.

(Ayrıca, eğer yapmazsanız ng-tekrar aynı kimliğe sahip birden fazla öğe oluşturmaya çalışacağından kimliğinize bir {{$ index}} son eki ekledim.

Benzer bir çalışma örneği


1
OP'nin Twitter Bootstrap satırları / sütunları için işaretlemeyi istediğine inanıyorum, ancak bu birisi için yararlı olabilir. Ancak, cevabınıza kodu ve açıklamayı eklemeniz gerekir. Yalnızca bağlantı yanıtları kaldırılacaktır.
m59

@ m59 Yanıt güncellendi. Öneriniz için teşekkürler
Cumulo Nimbus

1
Big +1, veri manipülasyonu gerektirmez . Bu, veriyi ng-tekrar kullanarak bir aralıkta 2 sütuna ayırma ihtiyacım için mükemmel çalıştı, böylece Bootstrap modal'ım çok uzun değildi! Bunun uygulanmasının ne kadar basit olduğuna şaşırdım! <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>Bu, modal gövdenin içindedir.
Christine268

15

m59'un cevabı oldukça iyi. Bundan hoşlanmadığım tek şey div, potansiyel olarak bir tablo için veri olabilecek şeyler için s kullanmasıdır .

Yani m59'un filtresiyle bağlantılı olarak (yukarıda bir yerde cevap), işte onu bir tabloda nasıl görüntüleyeceğiniz.

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

7

Aşağıdaki daha basit bir yoldur:

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

Cumulo Nimbus'ın cevabı benim için yararlı ama bu ızgaranın, liste çok uzun olduğunda kaydırma çubuğunu gösterebilen bir div ile sarılmasını istiyorum.

Bunu başarmak style="height:200px; overflow:auto"için tablonun etrafına tek bir sütun olarak gösterilmesine neden olan bir div ekledim .

Şimdi bir dizi uzunluğu için çalışıyor.


dizide yalnızca 1 öğe olduğunda, ilk satırın kendisini göstermez. bu değişikliği düzeltmek için ng-hide="$index%2!==0"
Anuj Pandey

4

Bir işlevim var ve bunu bir hizmette depoladım, böylece onu uygulamamın her yerinde kullanabilirim:

Hizmet:

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

});

Denetleyici:

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

İşaretleme:

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

Bu harika olsa da orderBy veya filter gibi diğer filtreleri kullanırken yardımcı olmuyor.
Robbie Smith

2

Benim yaklaşımım şeylerin bir karışımıydı.

Amacım, ekran boyutuna uyum sağlayan bir ızgaraya sahip olmaktı. Ben 3 sütun istediği lgiçin 2 sütun, smve md, ve 1 sütununda xs.

İlk olarak, açısal $windowhizmeti kullanarak aşağıdaki kapsam işlevini oluşturdum :

$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;
};

Daha sonra @Cumulo Nimbus tarafından önerilen sınıfı kullandım:

.new-row {
    clear: left;
}

Bu sayfada açıklandığı gibi yönergeyi içeren div'e ng-repeatekledim , böylece pencere her yeniden boyutlandırıldığında, açısal servis yeni değerlerle güncellenir.resizable$window

Nihayetinde, tekrarlanan div'de:

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

Lütfen bu yaklaşımdaki herhangi bir kusuru bana bildirin.

Umarım yardımcı olabilir.


2

Bootstrap tarafından önerilen "clearfix" CSS'si ile basit bir numara:

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

Pek çok avantaj: Verimli, hızlı, Boostrap önerilerini kullanarak, olası $ özet sorunlarını önleme ve Angular modelini değiştirmeme.


1

Bu örnek, dış verilerin iki sütunda listelemek istediğim bir iç diziyi içerdiği iç içe geçmiş bir tekrarlayıcı üretir. Kavram, üç veya daha fazla sütun için geçerli olacaktır.

İç sütunda, sınıra ulaşılana kadar "satırı" tekrarlıyorum. Sınır, öğe dizisinin uzunluğunun istenen sütun sayısına (bu durumda ikiye bölünmesiyle) belirlenir. Bölme yöntemi denetleyicide bulunur ve geçerli dizi uzunluğunu bir parametre olarak geçirir. JavaScript dilim (0, dizi.length / columnCount) işlevi daha sonra sınırı tekrarlayıcıya uyguladı.

İkinci sütun yineleyicisi daha sonra çağrılır ve ikinci sütundaki dizinin ikinci yarısını üreten dilimi (dizi.length / columnCount, dizi.length) tekrarlar.

<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);
};

Bunun çözüme başka bir şekilde bakmaya yardımcı olacağını umuyoruz. (PS, buradaki ilk yazım! :-))


1

.Row olmadan düzeltirim

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

ve css

.left {
  float: left;
}

1

İşte bunu yapmanın kolay bir yolu. Daha manueldir ve dağınık işaretlemeyle sonuçlanır. Bunu önermiyorum, ancak bunun yararlı olabileceği durumlar var.

İşte bir keman bağlantısı 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"},
        ...
    ];
});

Bu kurulum, işaretlemede biraz Math kullanmamızı gerektirir: /, bu nedenle şu satırı ekleyerek Math'ı enjekte etmeniz gerekir: $scope.Math = Math;


1

Tüm bu cevaplar büyük ölçüde mühendislikten geçmiş görünüyor.

Şimdiye kadarki en basit yöntem, girdi div'lerini bir col-md-4 sütun önyüklemesinde ayarlamak olurdu, ardından bootstrap, bootstrap'in 12 sütunlu yapısı nedeniyle otomatik olarak 3 sütuna biçimlendirir:

<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

M59'un çok iyi cevabına dayanarak. Model girişlerinin değişmeleri durumunda bulanık olacağını buldum, böylece bir seferde yalnızca bir karakteri değiştirebiliyordunuz. Bu, ihtiyacı olan herkes için nesne listeleri için yenidir:

DÜZENLE Bir sayfada birden çok filtreyi işlemek için güncellendi

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;
}); 

Ve bu kullanım olacaktır:

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

Anlayabildiğim kadarıyla, bu çoğu zaman işe yaramalı, ancak bu önbellekleme mantığı tamamen güvenilir görünmüyor ve kapsamı geçmek garip. Girişlere ihtiyaç duyulduğunda sadece denetleyici içinde filtrelemeyi gerçekten tavsiye ederim. Zaten teknik olarak doğru yaklaşım bu.
m59

0

Önyükleme ve angularjs konusunda yeniyim, ancak bu aynı zamanda bir grup olarak 4 öğe başına Array yapabilir, sonuç neredeyse 3 sütun gibi olacak. Bu numara bootstrap break line prensibini kullanır.

<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, kişisel olarak kullandığım yerleşik bir yığın yöntemine sahip: https://lodash.com/docs#chunk

Buna dayanarak, denetleyici kodu aşağıdaki gibi görünebilir:

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

Kodu görüntüle:

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

0

Başka bir yol, width:33.33%; float:leftbunun gibi bir sarmalayıcı div olarak ayarlanır :

<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

Kendimi benzer bir durumda buldum, her biri 3 sütundan oluşan görüntüleme grupları oluşturmak istiyordum. Ancak, bootstrap kullanıyor olmama rağmen, bu grupları farklı ebeveyn div'lerine ayırmaya çalışıyordum. Ayrıca genel olarak yararlı bir şey yapmak istedim.

ng-repeatAşağıdaki gibi 2 ile yaklaştım :

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

Bu, farklı sayıda sütuna geçmeyi ve birkaç üst bölüme ayrılmayı çok kolaylaştırır.


0

Birinin Angular 7 (ve daha yüksek bir sürüm) istemesi durumunda, uygulamalarımdan birinde kullandığım bir örnek:

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 DOSYASI

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

Bu, veritabanından ne kadar öğe yinelediğinize bağlı olarak dinamik olarak yeni sütunlar / satırlar oluşturmak için harika bir çözümdür. Teşekkürler!


-1

bu, bir sütunda 1,2,3 nasıl elde edileceği olan orijinal soruyu yanıtlar. - kuppu 8 Şub 14, 13:47 tarafından soruldu

açısaljs kodu:

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

Kodu Görüntüle (not: bootstrap 3 kullanarak):

<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

Bu kod, öğeleri lg ve md modunda üç sütun, sm modunda iki sütun ve tek sütun xs modunda hizalamaya yardımcı olacaktır.

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.