Внедрение $http и $scope в функцию в контроллере
Я задал аналогичный вопрос ранее при попытке ввести $scope и $http в контроллер Невозможно вызвать метод jsonp из undefined в Angular.js controller. Теперь я пытаюсь реорганизовать этот код немного, переместив код в функцию внутри контроллера. Я сталкиваюсь с подобными проблемами и, похоже, не понимаю механику инъекции зависимостей в Angular. Ниже мой новый код. И $scope, и $http - undefined. То, что я пытаюсь сделать, это сделать http-запрос, когда didSelectLanguage() запускает и присваивает полученные данные переменной "image" в области $scope от родительского контроллера. Может ли кто-нибудь просветить меня относительно того, как предполагается, что инъекция зависимости будет работать в этом примере?
angular.module('myApp.controllers', []).
controller('ImagesCtrl', ['$scope', '$http', function ($scope, $http) {
$scope.didSelectLanguage=function($scope, $http) {
console.log($scope);
$http.jsonp('http://localhost:3000/image?quantity=1&language='+this.language+'&Flag=&callback=JSON_CALLBACK')
.success(function(data){
$scope.image = data;
});
}
}])
Ответы
Ответ 1
При создании своего контроллера:
angular.module('myApp.controllers', []).
controller('ImagesCtrl', ['$scope', '$http', function ($scope, $http) {
// ...
});
Материал внутри тела функции контроллера автоматически имеет доступ к $scope
и $http
из-за closures. Таким образом, нет необходимости указывать что-либо дополнительное для функции в $scope
иметь доступ к этим вещам:
angular.module('myApp.controllers', []).
controller('ImagesCtrl', ['$scope', '$http', function ($scope, $http) {
$scope.didSelectLanguage = function() {
$http.jsonp('http://localhost:3000/image?quantity=1&language=' + this.language + '&Flag=&callback=JSON_CALLBACK');
.success(function(data){
$scope.$parent.image = data;
});
}
});
Когда выполняется didSelectLanguage
, он видит ссылки на $http
и выходит из функции во внешнюю функцию, чтобы получить значение ссылки; то же самое происходит для $scope
внутри обратного вызова успеха.
Итак, короче говоря, нет необходимости передавать какие-либо аргументы вашей функции didSelectLanguage
, и в этом случае нет причин использовать $injector
.
Ответ 2
С помощью комментария и статьи Брэндона Тилли я решил проблему следующим образом. Тем не менее, я собираюсь оставить вопрос открытым, пока кто-то не ответит, или пока я не пойму достаточно, чтобы написать сопроводительное объяснение.
controller('ImagesCtrl', ['$scope', '$http', '$injector', function ($scope, $http, $injector) {
$scope.didSelectLanguage=function() {
$http.jsonp('http://localhost:3000/image?quantity=1&language='+this.language+'&Flag=&callback=JSON_CALLBACK')
.success(function(data){
$scope.$parent.image = data;
});
}
}])