【问题标题】:TypeError: Object #<Object> has no method 'push' in Angular js Http.get requestTypeError: Object #<Object> 在 Angular js Http.get 请求中没有“push”方法
【发布时间】:2014-01-11 19:47:15
【问题描述】:

以下是我的控制器,它非常简单地尝试在单击按钮时提取数据,并尝试将其推入 ng-repeat。

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

        $scope.user  = [];
        $scope.posts = [];
        $http.get('http://hashtag.dev/api/v1/user').success(function(data) {
            $scope.user = data;
        });
        $http.get('http://hashtag.dev/api/v1/post').success(function(data) {
            $scope.posts = data;
        });

        $scope.loadmore = function() {

            $http.get('http://hashtag.dev/api/v1/post').success(function(data) {
                $scope.posts.push(data);
            });
        };
    });

当点击带有 ng-click="loadmore()" 的按钮时

 TypeError: Object #<Object> has no method 'push' 

怎么了?顺便说一句,我是一个完整的角菜鸟。服务器返回的 JSON..

 {
"total": 37,
"per_page": 10,
"current_page": 2,
"last_page": 4,
"from": 11,
"to": 20,
"data": [
    {
        "id": 84,
        "user_id": 4,
        "post_text": "Sunt eius voluptatem nostrum eos eos ipsa qui. Laudantium ratione repudiandae vitae sunt distinctio earum.",
        "created_at": "2013-12-15 14:29:00",
        "deleted_at": null,
        "user": {
            "id": 4,
            "full_name": "Vinnie Lang",
            "username": "vinnie398",
            "created_at": "2013-12-15 14:28:54"
        }
    },
    {
        "id": 82,
        "user_id": 2,
        "post_text": "Laudantium minus animi alias dolorum aperiam non. Odit quidem doloribus nihil eius incidunt sint nulla.",
        "created_at": "2013-12-15 14:29:00",
        "deleted_at": null,
        "user": {
            "id": 2,
            "full_name": "Shyanne Champlin",
            "username": "shyanne718",
            "created_at": "2013-12-15 14:28:53"
        }
    },...................

【问题讨论】:

  • console.log($scope.posts); 放入 loadmore 并检查您的控制台。
  • 为什么$scope.posts = [] 被注释掉了?在我看来,取消注释可以解决问题。
  • 哦,我这样做仍然不起作用,我正在添加响应,即 JSON。
  • @Tejas - console.log($scope) - 它应该是一个带有 posts 数组和 user 数组的对象 - 是吗?

标签: javascript angularjs laravel-4 eloquent


【解决方案1】:

问题是 $scope.posts 不是一个数组(或者任何东西,你不能只是 push 到一个未定义的变量并期望一个数组出现)。我会在控制器的开头或回调的开头定义一个空数组:

$scope.posts = [];

【讨论】:

  • 编辑问题请检查
【解决方案2】:

试试这个:

编辑

$scope.data = { posts : [] }

$scope.loadmore = function() {

    $http.get('http://hashtag.dev/api/v1/post').success(function(data) {
        $scope.data.posts.push.apply($scope.data.posts, data);
    });
};

【讨论】:

  • 每次调用 loadmore 时都会清空 posts 数组,而不仅仅是添加。
  • 对!这是一个错误
【解决方案3】:

假设您成功回调到$http.get('http://hashtag.dev/api/v1/post') 返回的data 是一个对象数组,您必须这样做:

1) 在你的控制器中定义一个$scope.posts=[],就像你定义$scope.user

2) 在loadmore() 中的$http.get('http://hashtag.dev/api/v1/post') 的成功回调中,您需要使用新数据扩充您的$scope.posts

$scope.posts = $scope.posts.concat(data);

【讨论】:

  • 现在它说 TypeError: Object # has no method 'concat',
  • @Tejas 你是不是在控制器的开头定义了 $scope.posts=[] 就在 $scope.user=[] 之后,并且是返回的 data 一个对象数组,每个对象对应于一个帖子?
  • 查看服务器返回的 JSON:成功回调中的 data 是您发布的巨大对象。从那里你需要.data 属性,它是一个帖子数组(1 个对象/帖子)。所以这样做:$scope.posts=data.data 在你第一次调用$http.get('http://hashtag.dev/api/v1/post') 和你的loadmore() 中你用$scope.posts 扩充$scope.posts = $scope.posts = $scope.posts.concat(data.data)
  • 是的,它现在可以工作了 :) .BTW 输出是由 laravel 雄辩的 orm 分页返回的 JSON 对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多