5

Gdy próbuje sondować niestandardową metodę copies na angularjs zasobów pojawia się następujący błąd w angular.js:10033: (. Metoda copy działa dobrze)TypeError: niezdefiniowane nie jest funkcją kątowego Zasobu

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) 

kątowa js 10016 - 10035:

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

Zmniejsz zasób:

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' 
    } 
    }); 

}); 

uproszczony dyrektywa gdzie dostaję błąd:

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

     }; 

    } 
    }; 

}); 

Jak tylko uruchomić metodę loadCopies, wykonanie linii $scope.resource.$copies() wyrzuca błąd powyżej.

W Chrome Inspector widzę, że wywołanie mojego interfejsu API jest faktycznie wykonywane. Ale rozwiązanie obietnicy wydaje się powodować błąd ...

Jak mogę rozwiązać ten błąd?

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! 

kątowa zasobów próbuje zastąpić mój początkowy zasób z tablicą elementów. Ale instancja Resource nie ma oczywiście metody push.

Odpowiedz

8

znalazłem odpowiedź:

Zasób ma reprezentować dopasowanego obiektu danych do końca jego żywotności. Jeśli chcesz pobrać nowe dane, powinieneś zrobić to z nowym obiektem.

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

Dzięki Guido. Miałem ten sam problem. Myślę, że dokumenty są nieco mylące. Jeśli rozumiem to poprawnie, nie można wywołać metody instancji, która ma wartość isArray: true w instancji/single/resource, ponieważ pojedyncza instancja nie jest tablicą. –

+1

Zgadza się. Ma to sens, jeśli się nad tym zastanowić: najpierw właściwość reprezentuje listę pozycji i nagle przedstawia pojedynczy element, który nie jest spójny. –

6

Odpowiedź od Guido jest poprawna, ale nie dostałem go po raz pierwszy.

Jeśli dodasz niestandardową metodę do Angulara $resource i używając isArray: true i spodziewasz się uzyskać Array czegoś ze swojej WebService, prawdopodobnie chcesz zapisać odpowiedź w Array.

Dlatego nie należy stosować metodę instancji takiego:

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

Ale użyciu zasobu bezpośrednio:

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

Korzystanie następujące Kątowymi zasobu:

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

Ten komentarz zakończył się dla mnie pół dnia bólu, thx. – bertrand

-1

jestem przy użyciu Mean.js i to nękane przez kilka godzin. Jest wbudowany $update, ale nie działał, gdy próbowałem zastosować go do obiektu zwróconego przez $resource. Aby to zadziałało, musiałem zmienić sposób wywoływania zasobu, aby go zaktualizować.

Na przykład z modułem Student, zwróciłem go z $resource do $scope.student. Podczas próby aktualizacji student.$update zwrócił ten błąd.Po zmodyfikowaniu wywołania na Students.update() naprawiono problem.

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

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