调用资源后出现AngularJS客户端错误。$ save:“TypeError:Object#<resource>没有方法'push'”</resource>

时间:2014-02-27 15:08:29

标签: angularjs ngresource

我正在开发一个AngularJS应用程序。我对AngularJS很新......

一切正常(加载数据,保存现有记录的修改,删除)。问题是使用REST服务返回的JSON数据更新客户端模型。服务器端代码正确运行并应用数据库更改。

例如为: 我以这种方式将新记录插入客户端模型:

$scope.addnewpage = function ($event){
        var newItem  = new Page();
        newItem.id = '-1'; // Indicates to the REST that it's an INSERT!      
        newItem.page_name = 'New Page';
        newItem.page_title_en = 'New Page';
        newItem.page_title_hu = 'Új oldal';
        newItem.mnu_title_hu = 'Nem Page';
        newItem.mnu_title_en = 'Új oldal';
        newItem.page_text_en = '...';
        newItem.page_text_hu = '...';
        newItem.page_footer_en = '...';
        newItem.page_footer_hu = '...';
        newItem.weight = '1';

        var idx = $scope.pages.push(newItem)-1;
        $scope.pages[idx].active = true;            
    }

在服务器端,我有一个PHP REST服务,它区分ID字段是否包含-1(INSERT new)还是大于0的整数(UPDATE existing)。

如果REST以正确的JSON格式向客户端返回包含NEW id和其他已调整字段的新记录,AngularJS将无法理解它在浏览器控制台上发送上述错误消息。

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

我的服务看起来像这样(我尝试更改isArray属性true / false - 同样的错误):

AdminModule.factory('Page', function($resource) {
    return $resource(
        '../admin/itcrest.php/page/:id',
        {id : '@id'},
        {  
           'get':    {method:'GET', isArray:false},
           'query':  {method:'GET', isArray:true},
           'save':   {method:'POST', isArray:true},
           'delete': {method:'PUT', isArray:true} 
        }
    );
});

我执行保存的控制器代码段是:

AdminModule.controller('PagesListController',  
    function ($scope, $http, $timeout, Page, $location, MessageBus, $modal) {
    // ...
    $scope.savepage = function (item, $event){
        item.$save(item, function(responseData) {}, 
            function(error) { });
    }
    // ...
 }

有没有人可以帮助我如何在没有完整页面重新加载的情况下管理新的记录插入,并使用来自服务器的实际数据更新客户端?我真正想要做的是从REST服务返回真实数据并使用新数据更新客户端模型记录 - 无论是在UPDATE还是在插入。如果我返回除空JSON之外的任何内容,则会发送错误。

由于服务器端代码运行良好并返回正确的数据,我认为问题必须在客户端。

谢谢。

1 个答案:

答案 0 :(得分:1)

  

$scope.pages不是数组。所以你得到了这个错误。您必须指定该数组,然后您可以将任何值推送到该数组。

试试这种方式。

        $scope.pages=[];    
        var idx = $scope.pages.push(newItem).length-1;
        $scope.pages[idx].active = true;  

也看到这一行

  

var idx = $ scope.pages.push(newItem) .length-1;