/ / jsonp błąd zwrotny w kątowym - angularjs

błąd wywołania zwrotnego jsonp w angular - angularjs

uzyskanie błędu wywołania zwrotnego w poniższym kodzie jako (Uncaught ReferenceError: updateData nie jest zdefiniowany) .może mi pomóc, proszę, jestem nowy na angularjs.

var student = angular.module("studentModule", []);

student.controller("StudentCtrl", ["$scope", "$http", function($scope, $http) {
$http({
method: "jsonp",
url: "http://abelski.com/courses/ajax/data.json?callback=updateData"

})
.success(function (data, status, headers, config) {
$scope.students = data;

})

.error(function (data, status, headers, config) {

});
}]);

linki do kodu codepen.io/anon/pen/bNOXgB

Odpowiedzi:

3 dla odpowiedzi № 1

Nazwa wywołania zwrotnego powinna być ciągiem JSON_CALLBACK (patrz https://docs.angularjs.org/api/ng/service/$ http # jsonp)

więc właściwy adres URL jest http://abelski.com/courses/ajax/data.json?callback=JSON_CALLBACK

JSON_CALLBACK jest tylko symbolem zastępczym, który jest zastępowany unikalną funkcją zwrotnego kąta dla każdego żądania jsonp


1 dla odpowiedzi nr 2

Dobra droga

Przede wszystkim sugerowałbym nie używać jsonp wwszystko. Łatwiej jest zepsuć i stworzyć więcej problemów związanych z bezpieczeństwem. Zamiast tego po prostu zwróć jsona w dobrym starym getcie. Istnieje bardzo mało ważnych przypadków faktycznego używania jsonp.

{
"name":"dave",
"id":123123,
"average":94
}

Sposób JSONP

Jeśli potrzebujesz użyć JSONP, to jest kilka problemów z twoim kodem.

Najważniejsze jest to, że twój interfejs API nie szanujeparametr wywołania zwrotnego. Jeśli klient określa nazwę wywołania zwrotnego, serwer musi użyć tej nazwy dla opakowania, nie może zwrócić swojej własnej zakodowanej nazwy. To jest obecny standard dla JSONP i Angular, który polega na tym, że podążasz za nim.

Jeśli źle kodujesz nazwę wywołania zwrotnego w backendwtedy jesteś zmuszony do utworzenia funkcji globalnej dla wywołania zwrotnego w twoim interfejsie, co zrobiłeś w swoim przykładzie jQuery. Nie chcesz tego robić, to jest bardzo zła praktyka. Angular jest o ograniczaniu i chcesz, aby twoje wywołanie zwrotne było uruchamiane przez $ http.success (), a nie w jakiejś globalnej metodzie, którą następnie musisz ponownie wprowadzić w Angular pływ.

Aby to zadziałało, musisz zamienić nazwę wywołania zwrotnego w adresie URL na JSON_CALLBACK, o czym już wspomniała milanlempera. Twój interfejs API również musi szanuj daną nazwę zwrotną i odpowiadajjson owinięty tą nazwą funkcji. Zwróć uwagę, że JSON_CALLBACK jest symbolem zastępczym, który zastępuje Angular (aby śledzić wiele żądań), więc nie możesz po prostu zakodować kodu JSON_CALLBACK w swoim backend, który również nie działa.Tak naprawdę musisz uczynić twój serwer zgodny ze standardami JSONP przez odpowiedź przez podaną nazwę wywołania zwrotnego, w przeciwnym razie nie można poprawnie używać jsonp Angulars.

Jeśli nie możesz zmienić interfejsu API, to twoją własną prawdziwą opcją jest utworzenie globalnej funkcji o nazwie updateData, której naprawdę polecam.


Bonus zaokrąglony

Po prostu piszę to, gdy jesteś nowy na Angular. Ogólną zasadą jest, aby nie wykonywać żądań http w kontrolerach.Od każdego żądania HTTP, które chcesz utworzyć, utwórz usługę do obsługi tych wywołań interfejsu API. Następnie możesz wstrzyknąć tę usługę w taki sam sposób, w jaki wstrzykujesz $ http lub $ scope do kontrolera. Pozwala na znacznie łatwiejsze ponowne użycie kodu, ponieważ możesz teraz wprowadzić ten sam interfejs API każdy kontroler, który tego potrzebuje bez konieczności powtarzania jakiegokolwiek kodu, a także generalnie łatwiej jest testować.