未捕获的类型错误:angular.lowercase不是一个函数。

33

未捕获的类型错误:angular.lowercase不是一个函数

这个错误出现在我的AngularJS应用程序中,整个应用程序不能运行。 这显示在textAngular-sanitize.js:413中。

我无法进行调试,尝试使用与angular.js相同的版本,但没有成功。 请为我提供解决方案。 除了控制台中的此错误消息之外,我没有其他内容可分享。

textAngular-sanitize.js:413 Uncaught TypeError: angular.lowercase is not a function
        at parseEndTag (textAngular-sanitize.js:413)
        at htmlParser (textAngular-sanitize.js:378)
        at textAngular-sanitize.js:147
        at textAngularSetup.js:443
        at Object.invoke (angular.js:5093)
        at angular.js:4892
        at forEach (angular.js:374)
        at createInjector (angular.js:4892)
        at doBootstrap (angular.js:1923)
        at bootstrap (angular.js:1944)
8个回答

40

正如您在这里所看到的,Angular 已经弃用了它们的 lowercase 实用工具方法。

您使用的库尚未更新,因此仅与 1.6.7 版本之前的 Angular 兼容。但是,由于您收到了此错误消息,您使用的 Angular 版本可能更高。

您可以选择:

(A) 在您的 bower.json 文件中将 Angular 降级为 1.6.7:

"dependencies": {
   "angular": "1.6.7",
   ...
}
"resolutions": {
   "angular": "1.6.7"
}

(B)通过将这些方法添加回来创建一个简单的解决方法,如下所示:

angular.lowercase = text => text.toLowerCase();

确保在 Angular 加载完成之后但应用程序启动之前完成此操作。


如何编辑我的bower.json文件以始终使用angular.js-1.6.7,或者请告诉我应该将您的代码放在哪里。 - Sudarshan Kalebere
你可以在主应用程序angular.module(...声明之前添加它 - 我不确定你的应用程序如何组织,因此我无法具体告诉你,但它应该在应用程序加载之前,但在angular库加载后。 - Ovidiu Dolha
1
只是好奇,为什么Angular选择创建自己的小写方法而不使用JS的呢?:( - Haymaker87
据我所知,他们还进行了一些输入验证(即检查您传递的是否实际上是字符串)-请参见https://github.com/angular/angular.js/blob/v1.4.14/src/Angular.js#L145...但除此之外,他们实际上正在使用标准方法,所以我猜这是为了与其他更复杂的util方法保持一致,比如`angular.extend`-当然,这是在ES6之前,像class和`Object.assign`这样的东西还没有出现。 - Ovidiu Dolha
3
我使用 angular.lowercase = text => (text || '').toLowerCase(); 来防止出现 nullundefined 值。 - Eduardo Cuomo
显示剩余2条评论

23

Angular 1.7.* 仍具有 lowercase 函数,但已重命名为 $$lowercase。 这是一个可能的解决方法。 基于 Angular 文档,购买者需谨慎

angular.module('MyApp').config(function() {
  angular.lowercase = angular.$$lowercase;  
});

1
非常感谢@Arthur,这是最好的答案,因为降级不被推荐! - Biruel Rick

7

我希望分享我的看法,以便帮助像我一样在使用中遇到问题的人们。主要问题是angularJS从其库中正式删除了小写和大写函数,因此那些使用textAngular-sanitize.js的人将会遇到错误,因为textangular仍然在其库中具有此方法,这会引发此问题。

你可以从项目中删除textAngular-sanitize.js,或者在angular.module加载之前将Ovidiu Dolha的代码包含在你的app.js中。

angular.uppercase=function(text){
 return text.toUpperCase();
 }
 angular.lowercase=function(text){
 return text.toLowerCase();
 }

angular.module('sampleApp', ....)

由Ovidiu Dolha提供的代码

angular.lowercase = text => text.toLowerCase();

可以写成:
angular.lowercase=function(text){
     return text.toLowerCase();
     }

两者都可以。谢谢。


4

我几乎能够理解Ovidiu Dolha的回答。如果您查看lowercase函数的弃用前实现,它要多一些。这个支架实现对我起到了作用:

/**
 * @brief Shim for textAngular in order to make it compatible with the latest 
 *   version of angularjs
 */

function lowercase(string) {
  return (typeof string === 'string') ? string.toLowerCase() : string;
}

// Angular deprecated the lowercase function as of v1.6.7. TextAngular hasn't 
// updated to reflect this
angular.lowercase = lowercase;

3
另一个适当的解决方案是按照此处建议的方式,用testAngularJs替换textAngularnpm install textangularjs

2

当我更新到angular 1.7.5时,发现了类似的问题,我的解决方案是更新angular-sanitize,问题得到了解决。 angular-sanitize


我正在使用AngularJS 1.7.8。我应该使用哪个版本的angular-translate? - Mark
我刚刚添加了1.7.9版本,这解决了我的问题。(对于未来几年到这里的任何人) - Kevin Brown

0
如果您正在使用AngularJS和TypeScript以及一个代码检查工具(在我的情况下是tslint + standard),正确的解决方法如下:
if (!angular.lowercase) (angular as any).lowercase = (text: string) => angular.isString(text) ? text.toLowerCase() : text

0

我正在使用 AngularJS v1.7.5。在我的控制器中,我使用了以下代码将字符串转换为小写:

function myCtrl($scope, $filter)
{
    var sampleText = "THIS IS TEST";
    var test = $filter('lowercase')(sampleText);
}

在控制器中注入$filter,并使用它将文本转换为小写。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接