วิธีการ ng-repeat จำนวนครั้งที่กำหนดแทนการทำซ้ำในอาร์เรย์?


417

มีวิธีในการ ng-repeatการจำนวนครั้งที่กำหนดแทนที่จะต้องย้ำมากกว่าอาร์เรย์?

ตัวอย่างเช่นด้านล่างฉันต้องการให้รายการแสดงขึ้น 5 เท่าโดยสมมติว่า$scope.numberเท่ากับ 5 นอกจากนี้การเพิ่มจำนวนดังนั้นแต่ละรายการจะเพิ่มขึ้นเช่น 1, 2, 3, 4, 5

ผลลัพธ์ที่ต้องการ:

<ul>
   <li><span>1</span></li>
   <li><span>2</span></li>
   <li><span>3</span></li>
   <li><span>4</span></li>
   <li><span>5</span></li>
</ul>


ซ้ำซ้อนที่เป็นไปได้ของIteration ng-repeat เท่านั้น X ครั้งใน AngularJs
TJ

คำตอบ:


569

อัปเดต (9/25/2018)

AngularJS รุ่นใหม่กว่า (> = 1.3.0) ให้คุณทำสิ่งนี้ได้ด้วยตัวแปร (ไม่จำเป็นต้องใช้ฟังก์ชั่น):

<li ng-repeat="x in [].constructor(number) track by $index">
    <span>{{ $index+1 }}</span>
</li>
$scope.number = 5;

นี่เป็นไปไม่ได้ในเวลาที่คำถามถูกถามครั้งแรก ขอมอบเครดิตให้แก่ @Nikhil Nambiar จากคำตอบของเขาด้านล่างสำหรับการอัปเดตนี้


ต้นฉบับ (5/29/2013)

ในขณะนี้ng-repeatยอมรับเฉพาะการรวบรวมเป็นพารามิเตอร์ แต่คุณสามารถทำได้:

<li ng-repeat="i in getNumber(number)">
    <span>{{ $index+1 }}</span>
</li>

และบางแห่งในคอนโทรลเลอร์ของคุณ:

$scope.number = 5;
$scope.getNumber = function(num) {
    return new Array(num);   
}

สิ่งนี้จะช่วยให้คุณเปลี่ยน $scope.numberเป็นหมายเลขใดก็ได้ตามที่คุณต้องการและยังคงมีผลผูกพันที่คุณต้องการ

แก้ไข (1/6/2014) - AngularJS (> = 1.1.5) รุ่นใหม่กว่าต้องใช้track by $index:

<li ng-repeat="i in getNumber(number) track by $index">
    <span>{{ $index+1 }}</span>
</li>

นี่คือซอที่มีสองรายการโดยใช้getNumberฟังก์ชั่นเดียวกัน


ฉันใช้สิ่งนี้กับรายการหลายรายการ แต่ดูเหมือนจะใช้ได้กับรายการแรกเท่านั้น คุณรู้ไหมว่าทำไมเป็นเช่นนี้
Malcr001

ควรทำงานกับรายการจำนวนเท่าใดก็ได้ ตรวจสอบซอนี้
แดน

1
ขอบคุณอีกครั้ง. ฉันลืมลบ ng-repeat บนองค์ประกอบพาเรนต์ มันใช้งานได้แล้ว ขอบคุณ
Malcr001

3
$ scope.getNumber = ฟังก์ชัน (จำนวน) {var x = new Array (); สำหรับ (var i = 0; i <num; i ++) {x.push (i + 1); } คืน x; } // ใช้ฟังก์ชั่นนี้เมื่อจำนวนมีการเปลี่ยนแปลงแบบไดนามิก
Manavendher

1
@ sh0ber เมื่อฉันต้องการเปลี่ยนรายการตามค่าที่เลือกในการเลื่อนลงตัวเลข ฉันลองใช้งานฟังก์ชั่นของคุณก่อนเมื่อมันไม่ทำงานฉันเปลี่ยนเป็นด้านบนเพื่ออัปเดตหมายเลข ของรายการเมื่อเลือกหมายเลขที่แตกต่างกันในเมนูแบบเลื่อนลง คุณช่วยตรวจสอบสถานการณ์ของฉันโดยใช้ฟังก์ชั่นของคุณได้ไหม
Manavendher

135

คุณสามารถทำได้:

<div ng-repeat="i in [1, 2, 3, 4]">
  ...
</div>

1
ทำงานเหมือนเสน่ห์ทดสอบบน Chrome 39.0.2171.95 โวลต์ (64 บิต), FF วี 33.1.1 และ Safari 8.0.2 วี...
Neara

วิธีนี้จะทำงานได้อย่างสมบูรณ์หากคุณใช้ในการควบคุมการแบ่งหน้าซึ่งสิ่งที่คุณต้องการคือ <li> <a href = "javascript :;" ng-click = "SelectPage ($ index)"> {{i}} </a> </li>
ริ

@AdityaMP ใช้สำหรับช่วงใน javascript stackoverflow.com/a/31989462/3160597
azerafati

1
พิจารณาการเรียกตัวสร้างอาร์เรย์สำหรับอาร์เรย์ความยาวแบบไดนามิกดังที่ระบุไว้ในคำตอบนี้
maxathousand และ

ถ้าฉันต้องทำซ้ำ 120 ครั้ง ฉันควรจะไปกับ [1,2,3 ... 120] หรือไม่
Munkhdelger Tumenbayar

94

นี่คือตัวอย่างของวิธีที่คุณสามารถทำได้ โปรดทราบว่าฉันได้แรงบันดาลใจจากความคิดเห็นในเอกสารซ้ำ ng: http://jsfiddle.net/digitalzebra/wnWY6/

หมายเหตุคำสั่ง ng-repeat:

<div ng-app>
    <div ng-controller="TestCtrl">
        <div ng-repeat="a in range(5) track by $index">{{$index + 1}}</div>
    </div>
</div>

นี่คือตัวควบคุม:

function TestCtrl($scope) {
    $scope.range = function(n) {
        return new Array(n);
    };
};

8
คุณสามารถใช้_.rangeจาก Underscore หรือ lodash เพื่อสร้างอาร์เรย์: $ scope.range = _.range (0, n);
บ่าย

83

ฉันคิดว่าjsFiddleจากหัวข้อนี้อาจเป็นสิ่งที่คุณกำลังมองหา

<div ng-app ng-controller="Main">
   <div ng-repeat="item in items | limitTo:2">
       {{item.name}}
   </div>
</div>

3
อ่านเพิ่มเติมเกี่ยวกับลิงก์ของเธรด google และอธิบายถึงวิธีการใช้ 'ชิ้น' เช่น group1: items.slice (0,3), group2: items.slice (3,6), ฯลฯ
trevorc

7
คำตอบนี้จะส่งผลให้เกิดรอยเท้าที่น้อยที่สุดในคอนโทรลเลอร์ของคุณและฉันเชื่อว่าเป็นวิธีการเชิงมุมที่ต้องการเช่นกัน คำตอบที่ได้รับการยอมรับ IMO ควรถูกแทนที่ด้วยสิ่งนี้
Matt Jensen

1
นี่ควรเป็นคำตอบที่ยอมรับได้ (ในความคิดของฉัน) - สง่างามที่สุดชอบมากที่สุด
โคดี้

11
@Cody โชคไม่ดีที่ไม่ตอบคำถาม OP ระบุ "แทนที่จะต้องวนซ้ำไปเรื่อย ๆ ในอาร์เรย์" และ "สมมติว่า$scope.numberเท่ากับ 5" จุดประสงค์คือการใช้ตัวแปรจำนวนเต็มเพื่อกำหนดจำนวนไอเท็มไม่ใช่ฮาร์ดโค้ดและไม่ใช้อาเรย์ที่กำหนดไว้ล่วงหน้า
ด่าน

5
@Cody @ sh0ber คุณสามารถตั้งค่าขีด จำกัด ในขอบเขตของคุณ ( $scope.limit = 2) และใช้มันเหมือน...|limitTo:limit- ดูซอที่อัปเดตแล้ว
drzaus

58

วิธีที่ง่ายกว่าคือ (ตัวอย่าง 5 ครั้ง):

<div ng-repeat="x in [].constructor(5) track by $index">
       ...
</div>

5
สุกใส อ่านสั้นและไม่มีฟังก์ชั่นโง่ ๆ ในคอนโทรลเลอร์เพื่อส่งกลับอาร์เรย์ใหม่
maxathousand และ

2
ฉันรักแบบนี้
รับบี Shuki Gur

โหวตขึ้นสิ่งนี้เป็นไปไม่ได้เมื่อคำถามถูกถามครั้งแรก (Angular 1.2) ฉันแก้ไขคำตอบที่ยอมรับเพื่อรวมสิ่งนี้ งานที่ดี!
ด่าน

1
ฉันแค่หวังว่าฉันจะเข้าใจว่าทำไมไวยากรณ์นี้ใช้งานได้ แต่ไม่ใช่Array(5)(หรือ[...Array(5).keys()]เพื่อรับอาร์เรย์ [0,1,2,3,4])
Dylan Nicholson

50

ฉันพบปัญหาเดียวกัน ฉันเจอกระทู้นี้ แต่ไม่ชอบวิธีที่พวกเขามีที่นี่ โซลูชันของฉันใช้ underscore.js ซึ่งเราติดตั้งไว้แล้ว มันง่ายอย่างนี้:

<ul>
    <li ng-repeat="n in _.range(1,6)"><span>{{n}}</span></li>
</ul>

สิ่งนี้จะทำสิ่งที่คุณต้องการอย่างแน่นอน


27
สิ่งนี้ดี แต่โปรดทราบว่าขีดเส้นใต้ไม่อยู่ในขอบเขตโดยค่าเริ่มต้นคุณจะไม่สามารถใช้งานได้ในมุมมอง HTML โดยไม่ทำอะไรเช่น$scope._ = _นี้
jedd.ahyoung

6
หากคุณกำลังใช้ lodash หรือขีดล่างคุณควรวางไว้$rootScopeเพื่อให้สามารถใช้ได้ทุกที่ ใส่สิ่งนี้ในapp.runฟังก์ชั่นของคุณหลังจากapp.config: app.run(function ($rootScope) { $rootScope._ = _; });
Jeremy Moritz

นี่เป็นคำตอบที่สมบูรณ์แบบสำหรับฉัน มันง่ายและตรงไปตรงมามาก ตั้งแต่ผมทำซ้ำโดยใช้ตัวแปรที่มีการนับที่ผมต้องทำ ng ซ้ำ = "n ใน _.range (1 นับ + 1) ขอขอบคุณสำหรับการแก้ปัญหา..
ดาร์ริล

ฉันลองสิ่งนี้และในขณะที่ _ แสดงเป็น $ rootScope การทำซ้ำ ng จะไม่แสดงผลใด ๆ
พอล

49

ฉันต้องการให้ html ของฉันมีน้อยมากดังนั้นกำหนดตัวกรองขนาดเล็กที่สร้างอาร์เรย์ [0,1,2, ... ] ตามที่คนอื่นทำ:

angular.module('awesomeApp')
  .filter('range', function(){
    return function(n) {
      var res = [];
      for (var i = 0; i < n; i++) {
        res.push(i);
      }
      return res;
    };
  });

หลังจากนั้นในมุมมองที่เป็นไปได้ที่จะใช้เช่นนี้:

<ul>
  <li ng-repeat="i in 5 | range">
    {{i+1}} <!-- the array will range from 0 to 4 -->
  </li>
</ul>

34

นี่เป็น UGLY จริง ๆ แต่ทำงานได้โดยไม่มีตัวควบคุมสำหรับจำนวนเต็มหรือตัวแปร:

จำนวนเต็ม:

<span ng-repeat="_ in ((_ = []) && (_.length=33) && _) track by $index">{{$index}}</span>

ตัวแปร:

<span ng-repeat="_ in ((_ = []) && (_.length=myVar) && _) track by $index">{{$index}}</span>

แฮ็คที่ดีที่สุด! ขอบคุณ
jannis

2
_ in (_ = []).length = 33; _ track by $indexขนาดเล็กกว่าเล็กน้อย
Fabricio

16

มีหลายวิธีในการทำเช่นนี้ ฉันใส่ใจที่จะมีตรรกะในคอนโทรลเลอร์ของฉันดังนั้นฉันจึงสร้างคำสั่งง่ายๆเพื่อแก้ปัญหาการทำซ้ำองค์ประกอบ n-times

การติดตั้ง:

คำสั่งสามารถติดตั้งได้โดยใช้ bower install angular-repeat-n

ตัวอย่าง:

<span ng-repeat-n="4">{{$index}}</span

ผลิต: 1234

นอกจากนี้ยังทำงานโดยใช้ตัวแปรขอบเขต:

<span ng-repeat-n="repeatNum"></span>

ที่มา:

Github


1
นี่คือสิ่งที่พวกเขาควรพิจารณาเพิ่มในคำสั่งเชิงมุมอย่างเป็นทางการ
HarshaXsoad

13

นี่เป็นเพียงการเปลี่ยนแปลงเล็กน้อยในคำตอบที่ยอมรับ แต่คุณไม่จำเป็นต้องสร้างฟังก์ชันใหม่ เพื่อนำเข้า 'Array' ในขอบเขตเท่านั้น:

<div ng-app="myapp">
    <div ng-controller="ctrlParent">
        <ul>
            <li ng-repeat="i in counter(5) track by $index">
              <span>{{$index+1}}</span></li>
        </ul>
    </div>
</div>
var app = angular.module('myapp',[]);
app.controller('ctrlParent',function($scope){
    $scope.myNumber = 5;
    $scope.counter = Array;
});

ดูซอนี้เป็นตัวอย่างชีวิต


4
ทันสมัย ​​(2559) และสะอาดกว่าเดิม!
Julien Malige

9

คำตอบที่ง่ายที่สุด: โค้ด 2 บรรทัด

JS (ในตัวควบคุม AngularJS ของคุณ)

$scope.range = new Array(MAX_REPEATS); // set MAX_REPEATS to the most repetitions you will ever need in a single ng-repeat that makes use of this strategy

HTML

<div ng-repeat="i in range.slice(0,repeatCount) track by $index"></div>

... โดยที่repeatCountจำนวนครั้งที่ซ้ำควรปรากฏในตำแหน่งนี้


1
ฉันเชื่อว่านี่จะไม่อนุญาตให้คุณเปลี่ยนจำนวนการทำซ้ำใน HTML หากมีการเปลี่ยนแปลงในคอนโทรลเลอร์ยกเว้นว่าคุณใส่ไว้ในฟังก์ชันเช่นคำตอบอื่น ๆ ได้ทำไปแล้ว
trysis

@trysis: ฉันไม่แน่ใจว่าฉันเข้าใจปัญหาของคุณหรือไม่ แต่คุณควรแทนที่repeatCountด้วยตัวเลขจริงใน HTML และตราบใดที่ตัวเลขนั้นน้อยกว่าหรือเท่ากับMAX_REPEATSคุณจะได้รับหมายเลขนี้ จากการทำซ้ำใน HTML
JellicleCat

1
ในความคิดของฉันนี่เป็นวิธีที่ยอดเยี่ยมที่สุดในการ จำกัดngRepeatคำสั่ง การใช้Array.prototype.sliceและ JS สำนวนควรเสมอได้รับเลือกมากกว่าห้องสมุดเช่น underscore.js (การเข้ากันได้ของเบราว์เซอร์ขึ้น)
Pat Migliaccio

ไม่ใช่วิธีที่ไม่ดี +1 แต่ฉันคิดว่าคำตอบนี้ง่ายกว่าและหลีกเลี่ยงการทำให้ตัวควบคุมยุ่งเหยิง
maxathousand และ

8

เชิงมุมให้ฟังก์ชั่นที่หวานมากเรียกว่าสไลซ์ .. การใช้สิ่งนี้คุณสามารถบรรลุสิ่งที่คุณกำลังมองหา เช่น ng-repeat = "ab ใน abc.slice (startIndex, endIndex)"

การสาธิตนี้: http://jsfiddle.net/sahilosheal/LurcV/39/จะช่วยคุณและบอกวิธีใช้ฟังก์ชัน "ทำให้ชีวิตง่ายขึ้น" :)

HTML:

<div class="div" ng-app >
    <div ng-controller="Main">
        <h2>sliced list(conditional NG-repeat)</h2>
        <ul ng-controller="ctrlParent">
            <li ng-repeat="ab in abc.slice(2,5)"><span>{{$index+1}} :: {{ab.name}} </span></li>
        </ul>
        <h2>unsliced list( no conditional NG-repeat)</h2>
         <ul ng-controller="ctrlParent">
            <li ng-repeat="ab in abc"><span>{{$index+1}} :: {{ab.name}} </span></li>
        </ul>

    </div>

CSS:

ul
{
list-style: none;
}
.div{
    padding:25px;
}
li{
    background:#d4d4d4;
    color:#052349;
}

NG-JS:

 function ctrlParent ($scope) {
    $scope.abc = [
     { "name": "What we do", url: "/Home/AboutUs" },
     { "name": "Photo Gallery", url: "/home/gallery" },
     { "name": "What we work", url: "/Home/AboutUs" },
     { "name": "Photo play", url: "/home/gallery" },
     { "name": "Where", url: "/Home/AboutUs" },
     { "name": "playground", url: "/home/gallery" },
     { "name": "What we score", url: "/Home/AboutUs" },
     { "name": "awesome", url: "/home/gallery" },
     { "name": "oscar", url: "/Home/AboutUs" },
     { "name": "american hustle", url: "/home/gallery" }
    ];
}
function Main($scope){
    $scope.items = [{sort: 1, name: 'First'}, 
                    {sort: 2, name: 'Second'}, 
                    {sort: 3, name: 'Third'}, 
                    {sort: 4, name:'Last'}];
    }

6

นี่คือคำตอบสำหรับเชิงมุม 1.2.x

โดยพื้นฐานแล้วมันจะเหมือนกันกับการปรับเปลี่ยนเล็กน้อยของ ng-repeat

<li ng-repeat="i in getNumber(myNumber) track by $index">

นี่คือซอ: http://jsfiddle.net/cHQLH/153/

นี่เป็นเพราะมุม 1.2 ไม่อนุญาตให้มีค่าซ้ำกันในคำสั่ง ซึ่งหมายความว่าหากคุณพยายามทำสิ่งต่อไปนี้คุณจะได้รับข้อผิดพลาด

<li ng-repeat="x in [1,1,1]"></li>

6

คุณสามารถใช้ng-ifคำสั่งด้วยng-repeat

ดังนั้นถ้า num เป็นจำนวนครั้งที่คุณต้องการให้องค์ประกอบซ้ำ:

<li ng-repeat="item in list" ng-if="$index < num">

1
สำหรับบรรดาของคุณที่ชอบมาร์กอัปที่สะอาดสะอ้าน ... โปรดทราบว่าการใช้ng-repeatวิธีนี้จะยังคงส่งออกเป็นแท็กที่แสดงความคิดเห็น ( <!-- ngIf: $index < num -->ฯลฯ .. ) จะไม่มีliองค์ประกอบใด ๆสำหรับ DOM ที่จะแสดงผล ทำเครื่องหมาย "ดูแหล่งที่มา" ในบานหน้าต่างผลลัพธ์ที่นี่เพื่อดูว่าฉันหมายถึงอะไร

3

คุณสามารถใช้ตัวอย่างนี้

ภายในตัวควบคุม:

$scope.data = {
    'myVal': 33,
    'maxVal': 55,
    'indexCount': function(count) {
        var cnt = 10;
        if (typeof count === 'number') {
            cnt = count;
        }
        return new Array(cnt);
    }
};

ตัวอย่างองค์ประกอบที่เลือกที่ด้านรหัส HTML:

<select ng-model="data.myVal" value="{{ data.myVal }}">
    <option ng-repeat="i in data.indexCount(data.maxVal) track by $index" value="{{ $index + 1 }}">{{ $index + 1 }}</option>
</select>

3

สำหรับผู้ใช้ที่ใช้ CoffeeScript คุณสามารถใช้ช่วงความเข้าใจ:

คำสั่ง

link: (scope, element, attrs) ->
  scope.range = [1..+attrs.range]

หรือตัวควบคุม

$scope.range = [1..+$someVariable]
$scope.range = [1..5] # Or just an integer

แบบ

<div ng-repeat="i in range">[ the rest of your code ]</div>

3

การขยายคำตอบแรกของ Ivan เล็กน้อยคุณสามารถใช้สตริงเป็นคอลเล็กชันที่ไม่มีแทร็กตามคำสั่งตราบใดที่อักขระนั้นไม่ซ้ำกันดังนั้นหากการใช้งานมีจำนวนน้อยกว่า 10 ตัวเลขตามคำถามที่ฉันจะทำ :

<ul>
   <li ng-repeat="n in '12345'"><span>{{n}}</span></li>
</ul>

ซึ่งเป็น jenky บิตแน่ใจ แต่ง่ายพอที่จะดูและไม่สับสนโดยเฉพาะ


2

ขั้นแรกให้สร้างตัวกรองเชิงมุมโดยใช้ LoDash:

angular.module('myApp').filter('times', function(){
   return function(value){
      return _.times(value || 0);
   }
});

ฟังก์ชัน LoDash times มีความสามารถในการจัดการค่า null, ไม่ได้กำหนด, 0, ตัวเลขและการแสดงสตริงของตัวเลข

จากนั้นใช้ใน HTML ของคุณตามนี้:

<span ng-repeat="i in 5 | times">
 <!--DO STUFF-->
</span>

หรือ

<span ng-repeat="i in myVar | times">
 <!--DO STUFF-->
</span>

1

ฉันต้องการวิธีแก้ปัญหาแบบไดนามิกที่มากขึ้น - ฉันสามารถเพิ่มการทำซ้ำได้ที่ไหน

HTML

<div ng-repeat="n in newUserCount">
<input type="text" value="" name="newuser{{n}}"/>
</div>

การควบคุมเครื่องโรเนียว

<span class="helper" ng-click="duplicateUser()">
Create another user with the same permissions
</span>

JS

 $scope.newUserCount = Array('1');
var primaryValue = 1;
$scope.duplicateUser = function()
{
    primaryValue++;
    $scope.newUserCount.push(primaryValue)
}

1

เชิงมุมมีตัวกรองเพื่อปรับเปลี่ยนคอลเลกชัน ในกรณีนี้การรวบรวมจะเป็นโมฆะเช่น [] และตัวกรองจะรับอาร์กิวเมนต์ดังนี้:

<div id="demo">
    <ul>
        <li ng-repeat="not in []|fixedNumber:number track by $index">{{$index}}</li>
    </ul>
</div>

JS:

module.filter('fixedNumber', function() {
    return function(emptyarray, number) {
        return Array(number);
    }
});

module.controller('myCtrl', ['$scope', function($scope) {
    $scope.number = 5;
}]);

วิธีนี้คล้ายกับวิธีที่เสนอข้างต้นและไม่จำเป็นต้องดีกว่า แต่แสดงพลังของตัวกรองใน AngularJS


1

หาก n ไม่สูงเกินไปตัวเลือกอื่นอาจใช้ split ('') กับสตริงที่มีอักขระ n ตัว:

<div ng-controller="MainCtrl">
<div ng-repeat="a in 'abcdefgh'.split('')">{{$index}}</div>
</div>

ฉันเชื่อว่าการแยกไม่จำเป็นที่นี่ สตริงเป็นอาร์เรย์ของอักขระอยู่แล้ว
ทุก

1

ฉันพบปัญหาเดียวกันและนี่คือสิ่งที่ฉันออกมาด้วย:

(function () {
  angular
    .module('app')
    .directive('repeatTimes', repeatTimes);

  function repeatTimes ($window, $compile) {
    return { link: link };

    function link (scope, element, attrs) {
      var times    = scope.$eval(attrs.repeatTimes),
          template = element.clone().removeAttr('repeat-times');

      $window._(times).times(function (i) {
        var _scope = angular.extend(scope.$new(), { '$index': i });
        var html = $compile(template.clone())(_scope);

        html.insertBefore(element);
      });

      element.remove();
    }
  }
})();

... และ html:

<div repeat-times="4">{{ $index }}</div>

ตัวอย่างสด

ฉันใช้timesฟังก์ชันขีดล่างเป็นตำแหน่งที่เราใช้มันในโครงการอยู่แล้ว แต่คุณสามารถแทนที่ได้ด้วยโค้ดเนทีฟ


0

ฉันกำลังสร้างคำสั่งนำมาใช้ซ้ำได้ซึ่งจำนวนสูงสุดจะมาจากอีก ng ซ้ำ ดังนั้นนี่คือการแก้ไขคำตอบที่โหวตที่สุด

เพียงแค่เปลี่ยนรหัสที่ตัวควบคุมเป็น -

$scope.getNumber = function(num) {
    var temp = [];
    for(var j = 0; j < num; j++){
        temp.push(j)
    }
    return temp; 
}

นี่จะส่งคืนอาร์เรย์ใหม่ที่มีการวนซ้ำตามจำนวนที่ระบุ


0

ตั้งแต่วนรอบสตริงมันจะแสดงรายการสำหรับถ่านแต่ละตัว:

<li ng-repeat = "k in 'aaaa' track by $index">
   {{$index}} //THIS DOESN'T ANSWER OP'S QUESTION. Read below.
</li>

เราสามารถใช้วิธีแก้ปัญหานี้น่าเกลียดแต่ไม่มีรหัสโดยใช้number|n decimal placesตัวกรองเนทิฟ

 <li ng-repeat="k in (0|number:mynumber -2 ) track by $index">
    {{$index}}
 </li>

ด้วยวิธีนี้เราจะมีmynumberองค์ประกอบที่ไม่มีรหัสพิเศษ '0.000'พูด
เราใช้mynumber - 2เพื่อชดเชย0.
มันจะไม่ทำงานกับตัวเลขที่ต่ำกว่า 3 แต่อาจมีประโยชน์ในบางกรณี


คุณใช้track by $indexไหม
Ivan Ferrer Villa

นี่คือสลัม af หากคุณกำลังจะถูกบังคับให้มีถ่านสำหรับการทำซ้ำแต่ละครั้งคุณก็อาจทำเช่นนั้นได้บ้างng-repeat="i in [1,2,3,4]"
Roi

แน่นอน แต่ OP ต้องการให้การวนซ้ำเป็นค่า n ตามตัวแปร$scope.number
Ivan Ferrer Villa

ทำไมไม่ 'abcd' แทน 'aaaa' จากนั้นก็ทิ้งแทร็กด้วย?
ทุก

aaaaเป็นตัวอย่างในการอธิบายของฉัน - ไม่สวยงามมาก - วิธีแก้ปัญหา เมื่อใช้ hardcoded 'aaaa' หรือ 'abcd' คุณจะได้รับรายการความยาวคงที่ แต่เพิ่มmynumber-2ทศนิยมเป็น 0 คุณจะได้รับ 'string' พร้อมmynumberตัวอักษร สมมติว่าmynumber=5คุณได้รับ'0.000'จากนั้นเราย้ำว่าใช้ดัชนี $
Ivan Ferrer Villa


-1

วิธีง่าย ๆ :

    public defaultCompetences: Array<number> = [1, 2, 3];

ในส่วนประกอบ / คอนโทรลเลอร์แล้ว:

    <div ng-repeat="i in $ctrl.defaultCompetences track by $index">

รหัสนี้มาจากโครงการ typescript ของฉัน แต่สามารถจัดใหม่เป็นจาวาสคริปต์ที่บริสุทธิ์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.