【问题标题】:Dynamically add filter in ng-repeat在 ng-repeat 中动态添加过滤器
【发布时间】:2015-06-12 19:02:15
【问题描述】:

我正在构建一个表格,其中的行和列完全基于发送给它的数据。

我非常接近让它工作,我无法弄清楚如何构建自定义过滤器并动态传递过滤器模式

组成列的对象看起来像

{ name: 'transactionDate', displayName: 'Date / Time', displayOrder: 1, filter: "date: 'MM/dd/yy hh:mm a'" }

构成交易的对象如下所示:

{ transactionDate: '2015-06-11', transactionType: 'This Type', transactionAmount: 25 }

HTML我是这样的:

<td ng-repeat="col in columns">{{transaction[col.name] | dynamicFilter: col.filter}}</td>

我目前构建的过滤器是:

function dynamicFilter($filter) {
    return function (value, filter) {
        console.log(filter);
        console.log(value);
        var test = $filter(filter)(value);
        return test;
    }
}

过滤器和值都正确传递。在返回之前,我无法弄清楚如何将过滤器应用于值。可能传入的值将是2015-06-10T16:17:14,而传入的过滤器可能是date: 'MM/dd/yy hh:mm a',以创建日期/时间过滤器。或 21currency 以获取美元价值。

我希望能够以与视图类似的方式使用 Angular 的内置功能

【问题讨论】:

    标签: angularjs angularjs-ng-repeat angularjs-filter


    【解决方案1】:

    对于这些具有部分参数(例如您提供的日期格式)的动态过滤器,您必须从过滤器中删除参数并稍后应用它。

    所以filter: "date: 'MM/dd/yy hh:mm a'",只需filter: "date"

    附加约束 MM/dd/yy hh:mm a 将与值 $filter(filter)(value, 'MM/dd/yy hh:mm a'); 一起发送

    一般来说,您可以利用apply。对象可以是:

    {filter: { type: "date", params: ['MM/dd/yy hh:mm a'] } }

    指令可以有(假设你也发送了参数):

    var filterFn = $filter(filter.type); 
    return filterFn.apply(filterFn, [value].concat(filter.params));
    

    编辑:这是一个带有两个按钮的 JSFiddle,第一个演示了您使用“日期:'MM/dd/yy hh:mm a'”的原始方法,第二个演示了我应用的方法上面的大纲http://jsfiddle.net/4whemakt/

    【讨论】:

    • 我正在沿着这条路工作,当我逐步通过 filterFn 时,按预期分配给filterFn = (date, format, timezone)。然而,回报并没有带来任何回报
    • 应该是$filter('date')(value, format, timezone);。这可以类似地称为 var filterFn = $filter('date'); filterFn.apply(filterFn, [value, format, timezone]); 。我添加到答案中的 JSFiddle 演示应该会有所帮助。
    【解决方案2】:

    您可以在您的动态过滤器中有条件地应用和返回过滤后的值。像这样的

    function dynamicFilter($filter) {
        return function (value, filter) {
            if (filter.indexOf('date:') !== -1) {
               //Note: I am using moment js to format the date
               return moment(value).format(filter.match(/'([^']+)'/)[1]);
            }
            else {
                return $filter(filter)(value)
            }
        }
    }
    

    moment.js 参考http://momentjs.com/

    【讨论】:

    • 但是我可以使用angularjs使用的内置过滤器吗?
    • 如果满足您的要求,您可以使用。我的回答中的filter.match(/'([^']+)'/)[1] 将从过滤器中提取并为您提供日期格式字符串。
    • 但是我正在为 Angular 已经内置的东西编写自定义规则。我也需要一个用于货币的规则。好像有些重复
    • 这实际上取决于您的需要。如果 Angular 提供的东西对您有帮助,那么最好使用它而不是编写自己的过滤器。
    猜你喜欢
    • 2019-07-12
    • 2016-06-16
    • 2015-06-21
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 2017-06-24
    • 2014-04-14
    • 2014-02-24
    相关资源
    最近更新 更多