javascript - 使用 Angular 智能表的日期范围过滤器

标签 javascript angularjs smart-table

我正在尝试在 Angular 智能表 ( http://lorenzofox3.github.io/smart-table-website/ ) 上应用日期范围过滤器,但是,我无法做到这一点。我在网上看到的唯一示例指向:http://plnkr.co/edit/Idbc1JNHKylHuX6mNwZ6?p=preview这也坏了。

这是我的 HTML:

<div st-table="releaseListDisplay" st-safe-src="releaseList">
        <div class="filter-box">
            <st-date-range></st-date-range>
        </div>
        <table class="list-page">
            <thead>
                <tr>
                    <th st-sort="releaseNum">Release#</th>
                    <th class="p15">Product Name</th>
                    <th st-sort="dateInternalRelease">Int. Release Date</th>
                </tr>
            </thead>
            <tbody>
                <tr ng-repeat="release in releaseListDisplay">
                    <td>{{release.releaseNum}}</td>
                    <td>{{release.buildNum}}</td>
                    <td>{{release.dateInternalRelease | date:'yyyy-MM-dd'}</td>

                </tr>
            </tbody>
            <tfoot>
                <tr>
                    <td colspan="9">
                        <div st-pagination="" st-items-by-page="10"></div>
                    </td>
                </tr>
            </tfoot>
        </table>
    </div>

这是 st-date-range 指令的 template.html 文件内容:

<label for="fromdate">From:</label>
<input type="date" name="fromdate" id="fromdate" 
       placeholder="MM/DD/YYYY" ng-model="fromDate"/>
<label for="todate">To:</label>
<input type="date" name="todate" id="todate" 
       placeholder="MM/DD/YYYY" ng-model="toDate"/>

这是指令:

app.directive('stDateRange', function($timeout){
return{
    restrict:'E',
    require:'^stTable',
    templateUrl:'template.html',
    scope:false,
    link: function(scope,element,attr,ctrl){
        var tableState = ctrl.tableState();
        scope.$watchGroup(["fromDate","toDate"],
                function(newValues,oldValues){

                    if(newValues){
                        var start = newValues[0];
                        var end = newValues[1];
                        if(start && end){
                            var d1 = new Date(start);
                            var d2 = new Date(end);
                            ctrl.search({after:d1.getTime(),before:d2.getTime()},'dateInternalRelease');

                        }
                    }

                }
        );
    }
};

});

我还尝试使用 $filter 来使用比较器函数过滤掉 releaseList 中的记录,但随后智能表分页中断。

我真的需要一些快速帮助。非常感谢!

最佳答案

张贴我的解决方案以防有人发现它有用:

我需要创建一个自定义过滤器,如下所示,然后在 View 模板中使用它:st-set-filter="customFilter"

    app.filter('customFilter', ['$filter', function ($filter) {
            var filterFilter = $filter('filter');
            var standardComparator = function standardComparator(obj, text) {
                text = ('' + text).toLowerCase();
                return ('' + obj).toLowerCase().indexOf(text) > -1;
            };

            return function customFilter(array, expression) {
                function customComparator(actual, expected) {
                    var isBeforeActivated = expected.before;
                    var isAfterActivated = expected.after;
                    var higherLimit, lowerLimit;
                    var itemDate, queryDate;

                    if (angular.isObject(expected)) {
                        //date range
                        if (expected.before || expected.after) {
                            try {
                                if (isBeforeActivated) {
                                    higherLimit = expected.before;
                                    itemDate = new Date(actual);
                                    queryDate = new Date(higherLimit);

                                    //if (actual > higherLimit) {
                                    if (itemDate > queryDate) {
                                        return false;
                                    }
                                }

                                if (isAfterActivated) {
                                    lowerLimit = expected.after;
                                    itemDate = new Date(actual);
                                    queryDate = new Date(lowerLimit);

                                    //if (actual < lowerLimit) {
                                    if (itemDate < queryDate) {
                                        return false;
                                    }
                                }

                                return true;
                            } catch (e) {
                                return false;
                            }

                        } 

                        return true;
                    }
                    return standardComparator(actual, expected);
                }

                var output = filterFilter(array, expression, customComparator);
                return output;
            };
        }]);

关于javascript - 使用 Angular 智能表的日期范围过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30634561/

相关文章:

javascript - 在 Angular 智能表中选择 st-search 不适用于 ng-model

javascript - 忽略使用 cancelable=false 取消 touchmove 事件的尝试,例如因为滚动正在进行且无法中断

javascript - 如何用Javascript制作一个非常简单的倒计时器?

javascript - 条件 ng-repeat

javascript - ng-repeat 与 ng-hide 或在 Controller 中执行此操作以提高性能?

javascript - 具有嵌套对象和 st-search 的 AngularJS 智能表奇怪行为

javascript - 排序在智能表 Angular js中不起作用

javascript - 从 HTML 表单事件调用解析 javascript 函数

javascript - jquery 最小和最大长度验证

javascript - AngularJS:使用相同输入添加和编辑列表项