Angular:如何制作可配置的过滤器

时间:2016-08-27 09:35:31

标签: angularjs angular-filters

是否可以像创建可配置服务一样创建可配置过滤器:

angular.module('app', [])
       .constant('baseUrl', '...')
       .filter('resourceUrl', ['baseUrl', function(baseUrl) {

       return function resourceUrlFilter(url) { /* returns the new url */ }
}]

我不想创建一个过滤器,为路径字符串添加基本URL前缀,并且url前缀应该是可配置的。

目前我通过在过滤器中注入一个常量来实现这一点

{{1}}

1 个答案:

答案 0 :(得分:0)

我今天提醒了这个问题,最近我不得不在服务中使用一些过滤器,这让我想到了:

  

由于要将过滤器注入服务,我们假设我已经创建了customDateFilter过滤器,我必须提供名称 myModule.factory('MyData', function(customDateFilter) { /* code */ }); 以便注入它

Filter

所以我想:

  

也许我可以像注册服务那样注册过滤器,但随后将ServiceProvider添加到名称并且有效

我不知道以这种方式注册过滤器是否合法,或者是否将来不会被删除 但这是一种允许您使用提供者注册过滤器的方法

简短版本:

您可以通过创建ServiceProvider创建常规可配置服务的方式来注册可配置过滤器 - > https://docs.angularjs.org/guide/providers#provider-recipe 但是当您向服务名称注册Filter追加var module = angular.module('app', []) var customDate = function filterProvider() { /* ServiceProvider definition */ }; myModule.provider('customDateFilter', customDate); 时:

JS
<p>Some date: <span>{{ $ctrl.date | customDate }}</span> </p>
HTML
config

工作插件示例

此plunk显示了可以配置的baseUrl过滤器的示例 模块的filter块中的前缀 https://plnkr.co/edit/RkTkKM?p=preview

其他选项

您始终可以创建一个执行过滤的服务,然后通过将其注入Provider Recipe工厂将其公开。此服务可以是使用class FilteringServiceProvider { $get() { return new FilteringService(this.configuration) } configure(params) { /* some config logic */ } } class FilteringService { constructor(configuration) {} filterDate(date) { /* some filtering on the date and return a value */ } } const myModule = angular.module('app.filters', []); myModule .provider('filteringService', FilteringServiceProvider) .filter('customDate', (filteringService) => filteringService.filterDate);

的可配置服务
String monthName = 'january'
assert 42 == new MonthlyResult( january:42 )[ monthName ]