根据过期日期删除角度数组

Angular Array Remove Based on Expiration Date

本文关键字:数组 删除 日期 过期      更新时间:2023-09-26

我有一个表单需要进行特定的验证。我有两个下拉列表,显示相同的数据(在这种情况下是带有截止日期的促销代码(。。

所以我的第一个下拉列表是促销代码:

<div class="input-group col-sm-12 col-md-12 col-lg-12">
     <span style="min-width: 150px;" class="input-group-addon promo-select">Select Promo Code</span>
     <select id="offer_promo" name="offer_promo" class="form-control" ng-change="promoAction()"
                    ng-model="promo"
                    ng-options="p.Promo_ID as p.Promo_Code + ' ( ' + p.Promo_Description + ' )' for p in promos">
         <option value="">Please Select A Promotion</option>
     </select>
</div>

所以我的第二个下拉列表是附加促销代码:

<div data-ng-show="(offer.is_primary === 1)" class="input-group col-sm-12 col-md-12 col-lg-12">
      <span class="input-group-addon">Additional Code</span>
      <select ng-disabled="additionalCodeDisabled" id="offer_promo_add" name="offer_promo_add" class="form-control" ng-model="addPromo"
                    ng-options="p.Promo_Code as p.Promo_Code + ' ( ' + p.Promo_Description + ' )' for p in addPromos"></select>
</div>

这是我在promoAction:中调用的过滤器控制器

$scope.promoFilter = function() {
  function promosFilteredBy(date) {
    var filteredPromos = $scope.addPromos.filter(function(addPromos) {
      console.log(filteredPromos);
      var promoDate = new Date($scope.promo_expiration);
      return promoDate < date;
    });
    return filteredPromos;
  }
  var selectedPromoDate = new Date($scope.promo_expiration);
  $scope.addPromos = promosFilteredBy(selectedPromoDate);
};

在我的控制器中,我得到了一个空白数组或filteredPromos的未定义数组。所以过滤功能没有正常运行,我不确定我在哪里错过了它

我的问题是,当用户在第一个下拉列表中选择促销代码时,它会根据您选择的内容有一个特定的过期代码。所以我想删除附加促销代码中的所有代码,也就是高于的第二次下拉代码。我不能使用.slice((,因为它们不是按时间顺序排列的。我使用momment.js作为日期,因此可能希望使用.isBefore((来比较日期。

所以我给你举个例子,我在第一个下拉列表中选择promo_code"25ANC"promo_expiration:"01/30/2017"。现在,附加促销下拉列表中超过该日期的任何内容都应该从下拉列表中删除。

我目前有一个$watch功能,正在观看促销和addPromo的ng模型。我知道我需要创建一个函数,将不符合日期验证的促销代码切片。但是,我应该如何创建该函数,以及应该在哪里具体调用该函数?

如果我缺少代码的任何部分,请告诉我我可以提供。

您肯定想要绑定到ng-change函数,但可能只在第一个下拉列表中(b/c从第一个下拉列表中选择是为第二个下拉列表筛选促销的触发器(。

这是一个plunker

ng-options更改为p而不仅仅是p.Promo_ID将把完整的促销对象绑定到ng-model,这意味着我们可以用$scope.promo.Promo_EXP访问选定的促销到期日期,并将其他促销日期与之进行比较。

您会注意到,第二个下拉列表绑定到一个范围变量additionalPromos,该变量是在$scope.promoAction()中创建的,基本上只是一个经过过滤的"有效"促销的数组(也就是日期小于您在第一个下拉列表中选择的日期的促销(。

我还没有看到你的完整实现,所以它可能不适合100%,但希望它能有所帮助。

所以我找到了一个使用momentjs比较两者的方法。我浏览了宣传片,然后返回了过滤器提供的内容,并将其作为addPromos。

$scope.promoFilter = function(promo_expiration) {
      function promosFilteredBy(promo_expiration) {
        return $scope.promos.filter(function(promo) {
          return moment(promo_expiration).isBefore(promo.Expiration_Date);
        });
      }
      $scope.addPromos = promosFilteredBy(promo_expiration);
};