5

Beim Versuch, eine benutzerdefinierte Methode copies auf einer AngularJS Ressource abzufragen ich folgende Fehlermeldung bei angular.js:10033 erhalten: (. Die Methode copy funktioniert gut)Typeerror: undefined ist keine Funktion in Angular Ressourcen

TypeError: undefined is not a function 
at https://code.angularjs.org/1.3.0-beta.8/angular-resource.min.js:9:347 
at Array.forEach (native) 
at q (https://code.angularjs.org/1.3.0-beta.8/angular.min.js:7:280) 
at q.then.p.$resolved (https://code.angularjs.org/1.3.0-beta.8/angular-resource.min.js:9:329) 
at J (https://code.angularjs.org/1.3.0-beta.8/angular.min.js:101:5) 
at J (https://code.angularjs.org/1.3.0-beta.8/angular.min.js:101:5) 
at https://code.angularjs.org/1.3.0-beta.8/angular.min.js:102:173 
at g.$eval (https://code.angularjs.org/1.3.0-beta.8/angular.min.js:113:138) 
at g.$digest (https://code.angularjs.org/1.3.0-beta.8/angular.min.js:110:215) 
at g.$apply (https://code.angularjs.org/1.3.0-beta.8/angular.min.js:113:468) 

Angular Js 10.016-10.035:

function consoleLog(type) { 
    var console = $window.console || {}, 
     logFn = console[type] || console.log || noop, 
     hasApply = false; 

    // Note: reading logFn.apply throws an error in IE11 in IE8 document mode. 
    // The reason behind this is that console.log has type "object" in IE8... 
    try { 
    hasApply = !!logFn.apply; 
    } catch (e) {} 

    if (hasApply) { 
    return function() { 
     var args = []; 
     forEach(arguments, function(arg) { 
     args.push(formatError(arg)); 
     }); 
     return logFn.apply(console, args); // This is line 10033 where the error gets thrown. 
    }; 
    } 

Vereinfachte Ressource:

angular.module('vgm.content-pages') 
.factory('ContentPage', function($resource, $http) { 

    return $resource('/api/content-page/:id', { id:'@page.id' }, { 
    copy: { 
     method: 'POST', 
     url: '/api/content-page/copy/:id' 
    }, 
    copies: { 
     method: 'GET', 
     isArray: true, 
     url: '/api/content-page/copies/:id' 
    } 
    }); 

}); 
Vereinfachte

Richtlinie wo erhalte ich die Fehlermeldung:

angular.module('vgm.genericForms') 
.directive('vgmFormCopyPicker', function() { 

    return { 
    restrict: 'E', 
    replace: true, 
    templateUrl: '/static/common/generic-forms/widgets/view-copy-picker.html', 
    scope: { 
     resource: '=', 
    }, 
    controller: function($scope, $element) { 

     $scope.pages = []; 

     $scope.loadCopies = function() { 

     $scope.resource.$copies() 
      .then(function(response) { 
      $scope.pages = response.data; 
      }); 

     }; 

    } 
    }; 

}); 

Sobald ich die loadCopies Methode ausgeführt, die Ausführung der Linie $scope.resource.$copies() führt den Fehler oben.

Im Chrome Inspector sehe ich, dass der Aufruf meiner API tatsächlich ausgeführt wird. Aber das Versprechen lösen scheint einen Fehler zu werfen ...

Wie kann ich diesen Fehler lösen?

EDIT:

$scope.resource = ContentPage.get({id: $stateParams.id}).$promise 
$scope.resource.$save() // Works 
$scope.resource.$update() // Works 
$scope.resource.$copy() // Works 
$scope.resource.$copies() // Does not work! 

Angular Ressource versucht, meine erste Ressource mit einer Reihe von Elementen zu überschreiben. Aber die Instanz von Resource hat natürlich keine Methode push.

Antwort

8

fand ich die Antwort:

Eine Ressource des angepassten Datenobjekt für den Rest seiner Lebensdauer darstellen soll. Wenn Sie neue Daten abrufen möchten, sollten Sie dies mit einem neuen Objekt tun.

$scope.copies = ContentPage.copies() 
+0

Dank Guido. Ich hatte das gleiche Problem. Ich denke, die Dokumente sind ein bisschen verwirrend. Wenn ich es richtig verstehe, können Sie keine Instanzmethode mit isArray: true für eine/single/resource-Instanz aufrufen, da die einzelne Instanz kein Array ist. –

+1

Das ist richtig. Und es macht Sinn, wenn Sie darüber nachdenken: zuerst stellt die Eigenschaft eine Liste von Elementen dar, und plötzlich stellt es ein einzelnes Element dar, das nicht konsistent ist. –

6

Die Antwort von Guido ist korrekt, aber ich habe es nicht beim ersten Mal bekommen.

Wenn Sie eine benutzerdefinierte Methode zu Ihrem Angular $resource hinzufügen und isArray: true verwenden und erwarten, ein Array von etwas von Ihrem WebService zu erhalten, möchten Sie wahrscheinlich die Antwort in einem Array speichern.

Daher sollten Sie nicht die Instanz-Methode wie folgt verwenden:

var ap = new Ansprechpartner(); 
$scope.nameDuplicates = ap.$searchByName(...); 

Aber die Ressource direkt verwenden:

$scope.nameDuplicates = Ansprechpartner.searchByName(...) 

Mit folgenden Angular Ressource:

mod.factory('Ansprechpartner', ['$resource', 
    function ($resource) { 
     return $resource('/api/Ansprechpartner/:id', 
      { id: '@ID' }, 
      { 
       "update": { method: "PUT" }, 
       "searchByName": { method: "GET", url: "/api/Ansprechpartner/searchByName/:name", isArray: true } 
      } 
     ); 
    } 
]); 
+0

Dieser Kommentar beendete einen halben Tag des Schmerzes für mich, thx. – bertrand

-1

Ich bin mit Mean.js und dies geplagt für ein paar Stunden. Es gibt ein eingebautes $update aber es funktionierte nicht, als ich versuchte, es auf ein Objekt anzuwenden, das von einem $resource zurückgegeben wurde. Damit es funktioniert, musste ich ändern, wie ich die Ressource anruft, um sie zu aktualisieren.

Zum Beispiel, mit einem Student Modul, ich gab es mit einem $resource in $scope.student zurück. Als ich versuchte, student.$update zu aktualisieren, kam dieser Fehler zurück.Durch Ändern des Aufrufs zu Students.update() wurde das Problem behoben.

$scope.update = function() { 
 
    var student = $scope.student; 
 
    var result = Students.update(student); 
 

 
    if(result){ 
 
     $scope.message = 'Success'; 
 
    } else { 
 
     $scope.error = 
 
     'Sorry, something went wrong.'; 
 
    } 
 
};