AngularJS - 以编程方式检查过滤器是否存在

时间:2015-05-25 13:46:46

标签: javascript angularjs angularjs-filter

有没有办法以编程方式检查是否存在具有给定名称的过滤器?

我开发了一个基于字符串输入处理页面内容的指令,我希望它在字符串的某个部分对应于我系统中存在的过滤器的情况下做出不同的反应。例如,我有一个本地化过滤器:

// Somewhere in the code
var myInput = 'localize';

// Somewhere else
var contentToProcess = 'my content';
var result = '';
if ($filter.hasOwnProperty(myInput))    // TODO: this is the part I'm trying to figure out
    result = $filter(myInput)(contentToProcess);
else
    result = 'something else';

3 个答案:

答案 0 :(得分:5)

Jonathan的回答也是可以接受的,但是我想找到一种方法来检查过滤器是否存在而不使用try catch。

您可以查看过滤器是否存在:

return $injector.has(filterName + 'Filter');

“过滤器”后缀在内部以角度添加,因此您必须记住添加它,否则您将始终返回false

答案 1 :(得分:1)

解决方案

这似乎对我有用。

var getFilterIfExists = function(filterName){
  try {
    return $filter(filterName);
  } catch (e){
    return null;
  }
};

然后你可以做一个简单的检查返回值。

// Somewhere in the code
var myInput = 'localize';
var filter = getFilterIfExists(myInput);
if (filter) { // Check if this is filter name or a filter string
  value = filter(value);
}

加成

如果您要解析一个过滤字符串,例如'currency:"USD$":0',您可以使用以下

var value; // the value to run the filter on
// Get the filter params out using a regex
var re = /([^:]*):([^:]*):?([\s\S]+)?/;
var matches;
if ((matches = re.exec(myInput)) !== null) {
    // View your result using the matches-variable.
    // eg matches[0] etc.
    value = $filter(matches[1])(value, matches[2], matches[3]);
}

将它们全部拉出来

希望有更优雅的方式用角度来做这个,但似乎并没有。

// Somewhere in the code
var myInput = 'localize';
var value; // the value to run the filter on


var getFilterIfExists = function(filterName){
  try {
    return $filter(filterName);
  } catch (e){
    return null;
  }
};
var filter = getFilterIfExists(this.col.cellFilter);
if (filter) { // Check if this is filter name or a filter string
  value = filter(value);
} else {
  // Get the filter params out using a regex
  // Test out this regex here https://regex101.com/r/rC5eR5/2
  var re = /([^:]*):([^:]*):?([\s\S]+)?/;
  var matches;
  if ((matches = re.exec(myInput)) !== null) {
      // View your result using the matches-variable.
      // eg matches[0] etc.
      value = $filter(matches[1])(value, matches[2], matches[3]);
  }
}

答案 2 :(得分:0)

你可以这样做:

var filter = $filter(myInput);
if (filter)
    result = filter(contentToProcess);
else
    result = 'something else';

未定义和空值在JS中被视为false,因此这适用于您的情况。