angularjs - 如何将过滤器传递给 AngularJS 中的指令

标签 angularjs filter directive

我有一个自定义指令,我希望能够将过滤器名称传递给它。然后该过滤器将在我的模板中使用。这是我到目前为止所得到的:

指令:

angular.module('forecastDirective', [])
.directive('forecast', ['appConfig', function(appConfig) {
    return {
        templateUrl: appConfig.directivesRoot + 'templates/forecast.html',
        replace: true,
        scope: {
            weatherObject: "=",
            convertToDate: "&",
            filterTemp: "@",
            dateFormat: "@",
        },
    }
}]);

模板:

<div class="panel panel-default">
    <div class="panel-heading">
        <h3 class="panel-title">{{ convertToDate({ dt: weatherObject.dt }) | date: dateFormat }}</h3>
    </div>
    <div class="panel-body">
        Daytime temperature: {{ weatherObject.temp.day | filterTemp }}
    </div>
</div>

最佳答案

一个非常简单的方法是,使用 $filter 服务和委托(delegate)给正确过滤器的作用域中的函数:

angular.module('forecastDirective', [])
.directive('forecast', ['appConfig', function(appConfig) {
    return {
        templateUrl: appConfig.directivesRoot + 'templates/forecast.html',
        replace: true,
        scope: {
            weatherObject: "=",
            convertToDate: "&",
            filterTemp: "@",
            dateFormat: "@",
        },
        controller: ['$filter', '$scope', function($filter, $scope) {
            $scope.filterFn = function(in) {
                return $filter($scope.filterTemp)(in);
            };
        }
    }
}]);

缺点是您不能再将其用作过滤器:

    <div class="panel-body">
        Daytime temperature: {{ filterFn(weatherObject.temp.day) }}
    </div>

我猜预期的过滤函数返回一个原语(字符串、数字、 bool 值)。如果它返回一些复杂的东西(对象、数组),您可能需要缓存返回值以避免无限的摘要循环。


您可以实现元过滤器:

angular.module(...)
    .filter('metafilter', ['$filter', function($filter) {
        return function(input, filterName) {
            return $filter(filterName)(input);
        };
    }]);

将其用作:

    <div class="panel-body">
        Daytime temperature: {{ weatherObject.temp.day | metafilter:filterTemp }}
    </div>

这是一个演示元过滤器的 fiddle :https://jsfiddle.net/opL1zfzd/

关于angularjs - 如何将过滤器传递给 AngularJS 中的指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34905351/

相关文章:

angularjs - Angular 和 SVG 过滤器

sql - 如何检查是否已提交日期 (dd/mm/yyyy)?

masm - 错误 A2105 : Expected : instruction or directive Assembly

angular - 如何从 ControlValueAccessor 获取 FormControl 实例

javascript - Angular.js 单元测试 "inject()"在 "run"阶段 block 之前触发

javascript - 我试图打印数组索引,但是我们如何在 angularjs 中以相反的顺序进行打印

r - dplyr::mutate new columns based on a second (filtered) dataframe

jQuery 使用 .filter() 作为 .addClass()

asp.net - @outputCache 指令在 ASP.NET 中有何用途?

angularjs - 选择选项时运行函数 angularJS