自定义角度过滤器给出TypeError不能调用undefined,但变量是定义和工作的

时间:2013-12-05 19:56:45

标签: javascript angularjs

我制作了以下Angular过滤器,使单词全部为大写:

   angular.module('module.name').filter('toUpperCase', function() {
        return function(input) {
            return input.toUpperCase();
        };
   });

在我的观点中,我使用以下一行:

   {{city | toUpperCase}}

当我正在运行代码时,城市会按原样转换为大写字母。但是,当我查看我的控制台时,我收到以下错误:

    TypeError: Cannot call method 'toUpperCase' of undefined

对于我使用的每个过滤器,我都会收到此错误两次。在您执行代码之前,您是否应首先检查是否有任何输入?

2 个答案:

答案 0 :(得分:3)

是。当JavaScript尝试访问未定义对象的任何属性时,将抛出此错误。

您可以使用 default-hack 模式来抑制此:

return function(input) {
  input = input || '';
  return input.toUpperCase();
};

答案 1 :(得分:2)

您需要在过滤器函数中添加一个检查,以检查其收到的输入是否为有效字符串,然后再调用toUpperCase()

angular.module('module.name').filter('toUpperCase', function() {
    return function(input) {
        return input && input.toUpperCase ? input.toUpperCase() : input;
    };
});

当角度更新绑定到city时,您可以获得city未定义或为空的时刻,但仍然会通过过滤器。使用上面的代码,您确保只有在它是有效参数时才尝试大写。

话虽如此,你知道,已经有一个uppercase过滤器内置角度。找到的文档为here