为什么我不能在AngularJS工厂中推送到阵列?

时间:2015-04-21 19:31:29

标签: arrays angularjs push

我有一个服务设置来从我的API获取信息并将其附加到数组。但是当我尝试使用push()函数时,我不断收到错误消息。

这是工厂:

.factory( 'SurgeryList', function($http, $rootScope) {
    var surgeryListService = {
        days: []
    };

    surgeryListService.getDays = function() {
        return days;
    };

    surgeryListService.nextPage = function() {

        var url = $rootScope.url+'/api/surgeries/day.json?surgery_date='+nextDate+'&access_token='+$rootScope.accessToken+'&callback=JSON_CALLBACK';

        $http.jsonp(url)
            .success(function(response, status, headers, config) {
                days.push(response.day);
            }
        );

        return days;
    };

    return surgeryListService;
})

我为push()

收到此错误
TypeError: days.push is not a function

我试图将days声明为对象和数组

days: {}
/
days: []

都会出现同样的错误。

我还注意到,当我将days声明为数组时,请使用console.log(days)。它从数组变为nextPage()函数中的对象。

我也尝试用concat()替换push(),但这也给了我“not a function”错误。

如果我使用键添加日期对象,我可以使用它。

days[response.day.date_string] = response.day;

但我想使用一些角度过滤器,当我设置这样的日子时,它们无法正常工作。

编辑:

工作代码与pankajparkar的回答略有不同。我不得不使用temp变量进行推送,然后将其连接到服务变量

var temp = [];
temp.push(response.day);
surgeryListService.days = temp.concat(surgeryListService.days);

2 个答案:

答案 0 :(得分:4)

您应该使用surgeryListService.days而不是days,因为您在服务surgeryListService内初始化了days对象,

您应该像以下一样重构您的服务,因为有很多错误。

<强>服务

.factory('SurgeryList', function($http, $rootScope) {
    var surgeryListService = {
        days: []
    };

    surgeryListService.getDays = function() {
        return surgeryListService.days;
    };

    surgeryListService.nextPage = function() {

        var url = $rootScope.url + '/api/surgeries/day.json?surgery_date=' + nextDate + '&access_token=' + $rootScope.accessToken + '&callback=JSON_CALLBACK';

        $http.jsonp(url)
            .success(function(response, status, headers, config) {
                surgeryListService.days.push(response.day);
            });

        return surgeryListService.days;
    };

    return surgeryListService;
})

答案 1 :(得分:2)

它必须是surgeryListService.days.push()而不是days.push

这里

$http.jsonp(url)
            .success(function(response, status, headers, config) {
               surgeryListService.days.push()(response.day);
            }
        );