1

私はAngularJSアプリケーションに取り組んでいます。私はAngularJSを初めて使用しています...

すべてが正常に機能します (データの読み込み、既存のレコードの変更の保存、削除)。問題は、REST サービスから返された JSON データでクライアント側モデルを更新することです。サーバー側のコードが正しく実行され、DB の変更が適用されます。

例: 次の方法でクライアント側モデルに新しいレコードを挿入します。

$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;            
    }

サーバー側には、ID フィールドに -1 (INSERT new) が含まれているか、0 より大きい整数 (UPDATE が存在する) が含まれているかを区別する PHP REST サービスがあります。

REST が NEW id とその他の調整されたフィールドを含む新しいレコードを正しい JSON 形式でクライアントに返す場合、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 と INSERT の両方の場合です。空の JSON 以外を返すと、エラーが送信されます。

サーバー側のコードはうまく機能し、正しいデータを返すので、問題はクライアント側にあるに違いないと思います。

ありがとうございました。

4

1 に答える 1

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;

于 2014-02-27T15:10:23.413 に答える