AngularJS:无法读取undefined的属性'substring'

时间:2014-06-25 12:56:22

标签: javascript angularjs angularjs-directive

AngularJS很新...我有一个输入字段,我希望第一个字母大写。我添加了以下指令:

.directive('capitalizeFirst', function () {
    return {
        require: 'ngModel',
        link: function ($scope, $element, $attrs, $modelCtrl) {

            var capitalize = function (inputValue) {

                var capitalized = angular.uppercase(inputValue.substring(0, 1)) + inputValue.substring(1);
                if (capitalized !== inputValue) {
                    $modelCtrl.$setViewValue(capitalized);
                    $modelCtrl.$render();
                }
                return capitalized;
            };
            $modelCtrl.$parsers.push(capitalize);
            capitalize($scope[$attrs.ngModel]); // capitalize initial value
        }
    };
})

有效!但它在我的控制台中引发错误:

TypeError:无法读取属性' substring'未定义的

有谁能让我知道出了什么问题?提前谢谢!

2 个答案:

答案 0 :(得分:5)

似乎你没有检查inputValue是否为空。

.directive('capitalizeFirst', function () {
return {
    require: 'ngModel',
    link: function ($scope, $element, $attrs, $modelCtrl) {

        var capitalize = function (inputValue) {
            if (!! inputValue) {
                 var capitalized = angular.uppercase(inputValue.substring(0, 1)) + inputValue.substring(1);
                 if (capitalized !== inputValue) {
                    $modelCtrl.$setViewValue(capitalized);
                    $modelCtrl.$render();
                 }
                 return capitalized;
            }
            return inputValue;
        };
        $modelCtrl.$parsers.push(capitalize);
        capitalize($scope[$attrs.ngModel]); // capitalize initial value
    }
};})

答案 1 :(得分:1)

这是我在进行API调用时调用str.slice(<start>,<end>)的解决方案,并且可能在API调用完成之前加载页面,因此您将收到错误消息:

无法读取属性&#39; substring&#39;未定义的

以下是我的angular/js/filters.js简单代码,用于评估我们调用strslice()之前的substring()是否在切片之前存在:

angular.module('conciergeFilters', []).filter('ph', function() {
  return function(str) {
    if (!! str) {
        return "(" + str.slice(2,5) + ")" + str.slice(5,8) + "-" + str.slice(8,12);
        }
    return str;
  };
});

此外,如果您尝试选择正确使用的方法,这里有一篇关于slice()substring()substr()之间区别的博文:

http://www.bennadel.com/blog/2159-using-slice-substring-and-substr-in-javascript.htm