【问题标题】:Cannot read property 'toLowerCase' of undefined (Angularjs/JavaScript/Json)无法读取未定义的属性“toLowerCase”(Angularjs/JavaScript/Json)
【发布时间】:2016-08-05 09:26:55
【问题描述】:

我正在构建 Angular/Express 应用程序,我使用控制器加载数据并尝试在函数中处理数据,但在控制台中出现错误

无法读取未定义的属性“toLowerCase”

当我手动编写 JSON 数据时,它工作得很好。 有人遇到过这个错误,为什么会这样?

编辑:另外我希望函数在点击时起作用,当我不希望它加载时,我也使用来自listData 的数据,所以我知道它已加载

控制器

var self = this; 
self.listData = [];

var self = this; 
self.listData = [];

$http.get('/myList')
.success(function (data) {
    self.listData = data;
    console.log(data);
})
.error(function (data) {
    console.log('Error: ' + data);
});

self.myFunc = function(){
    var map = self.listData.reduce(function (p, c) {
        p.set(c.name.toLowerCase(), c.surname);
        return p;
    }, new Map());

    console.log(...map);
}

【问题讨论】:

  • http.get 是异步的
  • 在reduce函数里面做console.log(c),看看数据是否正确。
  • 仅供参考 .success 和 .error 已被弃用。请改用 .then 和 .catch。
  • 使用console.log查看数据。 chrome 开发工具还有一个“网络”选项卡,可以显示传入的数据流

标签: javascript angularjs json ajax


【解决方案1】:

HTTP.GET 是一个异步函数

您可以在http.get.success 中调用将数据转换为小写的函数。这样你就知道数据已经到达。现在您可能执行此函数有点过早,这意味着您的列表中还没有数据。

如果您尝试在您的数据上运行 toLowerCase(),在您实际检索数据之前,您将收到此错误。这是您在处理 Web 请求时要学会处理的事情之一。

例如,像这样编写代码会起作用。

   $http.get('/myList')
           .success(function (data) {
                self.listData = data;
                myFunc(listData);
                console.log(data);
           })
           .error(function (data) {
                console.log('Error: ' + data);
           });

 }

 function myFunc(){

    var map = self.listData.reduce(function (p, c) {
                p.set(c.name.toLowerCase(), c.surname);
                return p;
           }, new Map());

           console.log(...map);

 }

【讨论】:

  • 这个函数在点击时执行,所以视图已经加载数据被加载到视图中。当我控制台它时, vm.word 工作正常。但只是不适用于功能。函数应该可以访问它,因为当我手动编写 vm.json 并与他一起工作时,它不会出现任何问题。
  • 你把错字留在那里,所以它的作用会更小。
  • @gyc 我修好了。我在这篇文章中看到了您的回答,OP 回复说这是由于他的帖子中的拼写错误,所以我停止了编辑并忘记了我已经复制粘贴了该部分。 ;-)
  • 它与 http.get 异步无关。不会在空数组上调用 .reduce 的回调。
【解决方案2】:

这是您在点击元素时更新的代码:

jQuery("#a-div-to-click").on("click", function() {
    var self = this; 
    self.listData = [];
    $http.get('/myList').success(function (data) {
            self.listData = data;
            console.log(data);
            self.myFunc();
       }).error(function (data) {
            console.log('Error: ' + data);
       });
    }
    self.myFunc = function(){
        var map = self.listData.reduce(function (p, c) {
                p.set(c.name.toLowerCase(), c.surname);
                return p;
        }, new Map());

        console.log(map);
    }

});

V2) 数据在“onload”阶段加载,过程在“onclick”阶段完成:

app.controller('yourController', function ($scope, $http) {

    $scope.fetchData = funcion(onSuccess) {
        $http.get('/myList').success(function (data) {
                $scope.aDivlistData = data;
                console.log(data);
                if (onSuccess != null) {
                    onSuccess();
                }
           }).error(function (data) {
                console.log('Error: ' + data);
           });
        }
    }();

    $scope.onADivClicked = function() {
        if ($scope.aDivlistData == null) {
            $scope.fetchData($scope.populateMap);
        } else {
            $scope.populateMap();
        }

    };

    $scope.populateMap = function() {
        var map = $scope.aDivlistData.reduce(function (p, c) {
                p.set(c.name.toLowerCase(), c.surname);
                return p;
        }, new Map());

        console.log(map);
    }
}
//html part:
//<div id="a-div-to-click" ng-click="onADivClicked()">A Div</a>

【讨论】:

  • 是的,但我需要再次从服务器加载数据,重点是处理一次加载的数据。
  • 检查我的 V2,如果不是你想要的那个,请告诉我,这样我就可以得到适合你的样本。
  • 更新了V2,现在保证你会得到你的数据,而且只会被填充一次。
【解决方案3】:

只需查看您的代码即可。看起来“c.name”是未定义的。也许您可以打印出该变量并查看其中的内容

【讨论】:

    【解决方案4】:

    c.name 对于您的 listData 中的某些项目未定义。签出您从服务器接收的 JSON,而不是伪造的

    注意$http.get 是异步的。 将self.myFunc = ... 放入$http.get 的成功处理程序中假设给出正确的行为。您可以查看 Understanding Asynchronous Code in Layman's terms 以了解异步是如何工作的。

    祝你好运! :)

    【讨论】:

    • 但是我不想在加载时执行该功能,我想在点击时执行。
    • 好的,在这种情况下,只需确保 ListData 在任何地方都正确写入。
    • 同样的事情,这是错字,但你可以在任何地方工作。我什至在视图中加载数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-22
    • 2021-11-28
    • 2020-07-23
    • 2020-06-24
    • 2018-10-23
    • 2021-05-26
    • 1970-01-01
    相关资源
    最近更新 更多