Подтвердить что ты не робот

Внедрение $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;
            });

        }

  }])
4b9b3361

Ответ 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;
            });

        }

  }])