AngularJs:循环编号

时间:2015-02-21 22:21:01

标签: angularjs

我循环一个数字(从0到7)以获得第二天的索引 在这里,贝娄是一个小提琴。

问题是第一天不是"星期一",而是星期五。所以,这个数字不是0而是4 ......

我不明白问题出在哪里 请帮忙



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

	app.controller('CalenderController', function(){
		this.firstDay = -1;
        
        this.getDayName = function(){
			this.firstDay++;
			if(this.firstDay ==  7){
				this.firstDay = 0;
			}
			return dayNames[this.firstDay];
		};
        
        this.dayLength = function(){
            return new Array(13);
        }
	});

	//Variables 
	var dayNames = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'];

})();

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js"></script>
<div class="container" ng-app="myApp" ng-controller="CalenderController as calender">
    	<div ng-repeat="item in calender.dayLength() track by $index">
    	    {{calender.getDayName()}}
    	</div>
</div>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

将副作用留在Angular正在观看的功能中是一个非常糟糕的主意。从表达式{{something()}}中调用的任何函数都将在每个摘要周期进行评估,因此,这些函数必须为idempotent

getDayName函数不是幂等的,因为它会更改this.firstDay

不仅如此,它还会在每次调用时返回不同的值,因此它会导致摘要周期重新运行(直到10次迭代后它被Angular中止)。

相反,请直接使用$index访问dayName数组:

<div ng-repeat="item in calendar.dayLength()">
  {{calendar.dayNames[$index % 7]}}
</div>

并将dayNames公开为具有this.dayNames的虚拟机。

编辑:第二个想法,最好把它作为一个函数公开,这样你就可以在那里做mod:

$scope.getDayName = function(dayIndex){
   return dayNames[dayIndex % 7];
}

并在视图中:

{{calendar.getDayName($index)}}

编辑2:如果您在2周内的所有日期都不需要<div> s的平面DOM层次结构,那么您甚至可以更简单地执行此操作:

<div ng-repeat="week in [0, 1]">
  <div ng-repeat="day in dayNames">
    {{day}}
  </div>
</div>