【问题标题】:Angular Loop Not Iterating Properly角循环没有正确迭代
【发布时间】:2019-12-07 22:56:04
【问题描述】:

我有一个休假管理系统的要求,用户可以根据他们的分配申请休假,并使用AngularASP.NET Web Api。示例:

UserId - Leave  - Allotment - Year
 1001  - Casual -   20      - 2019       
 1001  - Sick   -   20      - 2019
 1002  - Annual -   10      - 2019     

这是非常基本的。因此,每当用户尝试申请休假时,我都在做什么,系统从开始日期和结束日期获取总天数,最后检查总天数的分配。在前端,用户需要选择一个类型,具体的分配号要扣除如下:

<label for="leaveType">Leave Type</label>
<select [(ngModel)]="leaveType" [ngModelOptions]="{standalone: true}" class="form-control">
  <option value="">Please select leave</option>
  <option *ngFor="let value of leaveType" [ngValue]="value.LeaveType">
     {{value.LeaveType}}
  </option>
</select>    

我正在使用ASP.NET Web Api 为特定用户完美地获取休假分配详细信息,这就是我所做的:

leaveType: string;
chkLeave: number = 0;
userLeave: any;
this.dataservice.GetLeaveInfo(selectedValue).subscribe(result => { //selectedValue is another drop down value where users are being selected with user id
  this.userLeave = result;
}, error => console.error(error));

最后,在另一个使用Angular 的方法中,我尝试验证是否有可用的休假分配用于该特定休假类型,如下所示:

chkAllotment() {
var startDate = new Date(Result[0]);
var endDate = new Date(Result[1]);

const diff = endDate.getDate() - startDate.getDate();   

debugger;
for(let i = 0; i < this.userLeave.length; i++) {
    if(userLeave[i].LeaveName = this.leaveType && userLeave[i].LeaveRemains >= diff)
    this.chkLeave = 1;
  }
};

最后我这样做是为了检查休假类型分配是否可供用户使用:

if(this.chkLeave == 1) {
 alert("You can have the leave.");
} else {
 alert("Oops! You can't have the leave.");
}

现在的问题是多次休假分配,该方法运行良好,并验证了单次分配的分配,如 Annual。假设用户 1001,它有两个休假类型分配。因此,当我选择临时休假时,它第一次根据分配完美检查用户是否有资格获得休假,但是当我选择第二种休假类型时卡住了,比如生病并且休假天数超过了分配数(基本上分配是总愉快的日子)。它保持第一次休假的状态,变量 chkLeave 根据第一次选择的休假类型保存数字 0 或 1。在浏览器的检查元素中,我可以在数组中查看休假分配的详细信息,但是在验证时,循环以某种方式没有给出预期的输出。 for循环有什么问题吗?

【问题讨论】:

  • 注意:您可以将 LeaveRemains 视为条件语句中的分配,带有休假名称和差异 (diff)。

标签: c# angular asp.net-web-api


【解决方案1】:

尝试进行此更改,因为我注意到您有 hte chkLeave,它不再设置为 0,因此它保留了上一次迭代的 1。

chkAllotment() {
   var startDate = new Date(Result[0]);
   var endDate = new Date(Result[1]);

   const diff = endDate.getDate() - startDate.getDate();   

   debugger;
   // Re initialize the chkLeave to 0
   this.chkLeave = 0;
   for(let i = 0; i < this.userLeave.length; i++) {
       if(this.userLeave[i].LeaveName = this.leaveType && userLeave[i].LeaveRemains >= diff)
       this.chkLeave = 1;
     }
};

另外,如果休假超过一个月,您处理差异的方式可能会导致问题。

getDate() 方法返回指定日期的月份日期(从 1 到 31)。

这意味着 2019-12-01 与 2020-01-01 相差 0 天。

基本上这可能是两个原因中的任何一个。

编辑 1:

userLeave[i].LeaveName == this.leaveType

应该是

userLeave[i].LeaveType == this.leaveType

编辑 2:

要计算两天之间的差异,请参阅指南here。不过要小心,因为您希望有天,没有秒/毫秒,因为它可能会产生舍入问题。

【讨论】:

  • 源代码中至少有 两个 错误。你能找到他们吗? :)
  • 这一行有什么问题? if(userLeave[i].LeaveName = this.leaveType &amp;&amp; userLeave[i].LeaveRemains &gt;= diff)
  • 妈的,我一下子没看出来,你说的很对。
  • userLeave 将是 undefined 并且userLeave[i].LeaveName = this.leaveType 是一个赋值而不是比较。
  • [ngValue]="value.LeaveType" 是绑定值,而不是LeaveName。我应该把它放在一个堆栈闪电战中;)
猜你喜欢
  • 2022-11-18
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
  • 2014-12-24
  • 2021-08-09
  • 1970-01-01
相关资源
最近更新 更多