【问题标题】:Angular JS ng-table Date Range filter issueAngular JS ng-table 日期范围过滤器问题
【发布时间】:2014-11-17 08:26:26
【问题描述】:

我有一个使用 ng-table 的日期范围过滤器列表。我可以使用 ng-table 轻松过滤名称和其他字符串/数字字段。但日期范围过滤器似乎不起作用。

我的json数据列表

{  
   "data":[  
      {  
         "cellphone":"24234234234",
         "createddate":"09/09/2014",
         "firstname":"Giacomo",
         "resellerid":"747845473"
      },
      {  
         "cellphone":"24234234234",
         "createddate":"09/02/2010",
         "firstname":"Tomy",
         "resellerid":"747783"
      },
      {  
         "cellphone":"999999",
         "createddate":"09/02/2010",
         "firstname":"Sunny",
         "resellerid":"2312312"
      }
   ]
}

我正在使用 ng-repeat 来遍历这个 json 对象。

过滤器框在表格之外,我正在使用以下代码

 <table class="table display table-striped table-bordered" ng-table="tableParams">

                <tr ng-repeat="customer in $data | filter: id | filter :name 
              |filter :createdfrom>
                <td data-title="'Reseller ID'" sortable="'resellerid'">
                {{customer.resellerid}}
                </td>
                <td data-title="'Reseller Name'" sortable="'firstname'">
                {{customer.firstname}} {{customer.lastname}}
                </td>
                <td data-title="'Created Date'" sortable="'createddate'">
                {{customer.createddate}}
                </td>
                </tr>
  </table>

在表格外的过滤框中

                  <div class="col-sm-2">
                        <input type="text" placeholder="747873" id="exampleInputEmail2"
                            class="form-control" ng-model="id.resellerid">
                    </div>
                    <div class="col-sm-2">
                        <input type="text" placeholder="Enter Name"
                            id="exampleInputPassword2" class="form-control"
                            ng-model="name.firstname">
                    </div>
                    <input  class="form-control" type="text"
                                datepicker-popup="{{format}}" ng-model="createdfrom.createddate"  is-open="opened1" 
                                min-date="minDate" max-date="'2015-06-22'"  datepicker-options="dateOptions" date-disabled="disabled(date, mode)" ng-required="true"
                                close-text="Close" placeholder="DD/MM/YY" id="date1" > 
                                <span
                                class="input-group-btn">
                                <button type="button" class="btn btn-default"
                                    ng-click="open1($event)">
                                    <i class="glyphicon glyphicon-calendar"></i>
                                </button>
                            </span>
                        </div>

但是日期字段没有过滤 json 数据。

有没有办法使用“从”和“到”日期字段中的日期过滤数据?

任何帮助/提示将不胜感激。

谢谢 杰伊什

【问题讨论】:

    标签: javascript angularjs filter date-range ngtable


    【解决方案1】:

    您确定 ng-model="createdfrom.createddate" 将任何数据附加到 $scope 吗?

    尝试添加 &lt;pre&gt;createdfrom.createddate: {{ createdfrom.createddate }}&lt;/pre&gt; 以查看该 datepicker 指令是否会更改 $scope 中的值。

    编辑: 检查工作示例:http://jsfiddle.net/ulfryk/vbvyt8we/


    EDIT2:

    我找到了答案:

    <tr ng-repeat="customer in $data | filter: id | filter :name 
              |filter :createdfrom>
    

    你在|filter :createdfrom之后和&gt;之前错过了":D


    EDIT3:

    datepicker 在模型中保存Date 类型的值,并在视图层中格式化为String 表示。因此,您可能需要一些其他指令或过滤器来将该模型数据转换为格式化字符串,或者将视图值传递给模型中的其他字段:

    yourModule.directive('viewValueModel', [
        '$parse',
        function ($parse) {
            return {
                require: 'ngModel',
                link: function (scope, element, attrs, ngModelCtrl) {
                    ngModelCtrl.$viewChangeListeners.push(function () {
                        $parse(attrs.viewValueModel).assign(scope, ngModelCtrl.$viewValue);
                    });
                }
            };
        }
    ]);
    

    并像这样使用它:

    <input
        class="form-control"
        type="text"
        datepicker-popup="{{format}}"
    
        ng-model="someFakeModelPlaceholder"
        view-value-model="createdfrom.createddate"
    
        is-open="opened1"
        min-date="minDate"
        max-date="'2015-06-22'"
        datepicker-options="dateOptions"
        date-disabled="disabled(date, mode)"
        ng-required="true"
        close-text="Close"
        placeholder="DD/MM/YY"
        id="date1"> 
    

    【讨论】:

    • 看来我的日期选择器根本没有以正确的格式给出日期。我使用引导日期选择器 - angular-ui.github.io/bootstrap - 当我在 datepicker 中选择 09/02/2010 时,所选日期显示如下 - createdfrom.createddate: "2010-02-08T18:30:00.000Z" 我已经格式化了 datepicker 日期在我的控制器中“$scope.format = 'dd/MM/yyyy';”它完美地在文本框中显示日期。可能是什么问题?
    • 添加编辑回答 - 这可能只是 HTML 错误 - 在打开 &gt; 之前缺少 " &lt;tr&gt; 标签..
    • 添加了第 3 次编辑以回答第 2 次和第 3 次,应该可以解决所有问题 :)
    • 我已经复制了过滤器的一部分,引号已经在那里了。
    • 好的。所以检查第三个EDIT。这应该会有所帮助:)
    【解决方案2】:

    我使用 UI-Bootstrap 日期选择器创建了这个。 看看这是否能解决您的问题。

    // Code goes here
    
    var myapp = angular.module('NgTableExample', ['ngAnimate', 'ui.bootstrap', 'ngTable']);
    
    function parseDate(input) {
      return Date.parse(input);
    }
    
    myapp.filter("dateRangeFilter", function() {
      return function(items, from, to) {
        var df = parseDate(from);
        var dt = parseDate(to);
        var result = [];
        for (var i = 0; i < items.length; i++) {
          var date_bet = items[i].datetime;
          if (date_bet > df && dt > date_bet) {
            result.push(items[i]);
          }
        }
        return result;
      };
    });
    
    myapp.controller("ExampleCtrl", function($scope, $filter, NgTableParams) {
    
      var self = this;
      var data = [{
        name: "Moroni",
        age: 50,
        datetime: 1450562394000
      }, {
        name: "Simon",
        age: 43,
        datetime: 1450562394000
      }, {
        name: "Jacob",
        age: 27,
        datetime: 1450648794000
      }, {
        name: "Nephi",
        age: 29,
        datetime: 1450648794000
      }, {
        name: "Christian",
        age: 34,
        datetime: 1450475994000
      }, {
        name: "Tiancum",
        age: 43,
        datetime: 1450475994000
      }, {
        name: "Jacob",
        age: 27,
        datetime: 1450475994000
      }];
    
      self.sensorTableData = new NgTableParams({
        count: 7
      }, {
        dataset: data
      });
    
      $scope.today = function() {
        $scope.dt2 = new Date(2015, 11, 26);
        $scope.dt1 = new Date(2015, 11, 17);
    
      };
    
    
    
      $scope.today();
      $scope.toggleMin = function() {
        $scope.minDate = $scope.minDate ? null : new Date();
      };
      $scope.toggleMin();
      $scope.maxDate = new Date(2020, 5, 22);
    
      $scope.open1 = function($event) {
        $scope.status1.opened = true;
      };
    
      $scope.open2 = function($event) {
        $scope.status2.opened = true;
      };
    
      $scope.setDate = function(year, month, day) {
        $scope.dt1 = new Date(year, month, day);
        $scope.dt2 = new Date(year, month, day);
    
      };
    
      $scope.dateOptions = {
        formatYear: 'yy',
        startingDay: 1
      };
    
      $scope.formats = ['dd-MMMM-yyyy', 'yyyy/MM/dd', 'dd.MM.yyyy', 'shortDate'];
      $scope.format = $scope.formats[0];
    
      $scope.status1 = {
        opened: false
      };
    
      $scope.status2 = {
        opened: false
      };
    
    
    });
    <!DOCTYPE html>
    <html>
    
    <head>
      <link data-require="bootstrap-css@*" data-semver="3.3.6" rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.css" />
      <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
      <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular.js"></script>
      <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.4.7/angular-animate.js"></script>
      <script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.14.3.js"></script>
      <link rel="stylesheet" href="https://rawgit.com/esvit/ng-table/master/dist/ng-table.min.css">
      <script src="https://rawgit.com/esvit/ng-table/master/dist/ng-table.min.js"></script>
      <link rel="stylesheet" href="style.css" />
      <script src="script.js"></script>
    </head>
    
    <body ng-app="NgTableExample">
      <h1>Date Range Filter For Ng-table!</h1>
    
      <div ng-controller="ExampleCtrl as exc">
        <h4>From Date</h4>
        <p class="input-group">
          <input type="text" class="form-control" uib-datepicker-popup="{{format}}" ng-model="dt1" is-open="status1.opened" max-date="maxDate" datepicker-options="dateOptions" date-disabled="disabled(date, mode)" ng-required="true" close-text="Close" />
          <span class="input-group-btn">
              <button type="button" class="btn btn-default" ng-click="open1($event)"><i class="glyphicon glyphicon-calendar"></i></button>
            </span>
        </p>
        <h4>To Date</h4>
        <p class="input-group">
          <input type="text" class="form-control" uib-datepicker-popup="{{format}}" ng-model="dt2" is-open="status2.opened" max-date="maxDate" datepicker-options="dateOptions" date-disabled="disabled(date, mode)" ng-required="true" close-text="Close" />
          <span class="input-group-btn">
              <button type="button" class="btn btn-default" ng-click="open2($event)"><i class="glyphicon glyphicon-calendar"></i></button>
            </span>
        </p>
    
        <div>
          <table ng-table="exc.sensorTableData" class="table table-condensed table-bordered table-striped">
            <tr ng-repeat="row in $data | dateRangeFilter:dt1:dt2">
              <td data-title="'Name'" sortable="'name'">{{row.name}}</td>
              <td data-title="'Age'" sortable="'age'">{{row.age}}</td>
              <td data-title="'Date'" sortable="'age'">{{row.datetime | date:'dd-MMMM-yyyy'}}</td>
            </tr>
          </table>
        </div>
      </div>
    </body>
    
    </html>

    【讨论】:

    • 我试图实现您的代码,但它不适合我。它显示未定义的项目
    【解决方案3】:

    跟进 Himanshu Jain 示例,我不得不对其进行调整以使其正常工作。

    (function () {
    'use strict';
    angular.module('app').filter("dateRangeFilter", ['$filter', function ($filter) {
        return function (items, from, to) {
            var df = from;
            var dt = to;
            var result = [];
            for (var i = 0; i < items.length; i++) {
                var date_bet = parseDate(items[i].StartDate);
                if (date_bet >= df && dt >= date_bet) {
                    result.push(items[i]);
                }
            }
            return result;
        };
    }]);
    

    })();

    【讨论】:

      猜你喜欢
      • 2016-10-27
      • 2016-06-06
      • 2019-07-05
      • 2021-11-27
      • 2018-06-19
      • 2020-11-09
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多