Я получаю ошибку «не является функцией» при вызове заводского метода из контроллера в angular.js

#angularjs

#angularjs

Вопрос:

Я пытаюсь вызвать заводской метод в angular.js из моего метода контроллера, и он выдает ошибку «не является функцией»

Вот как выглядит завод:

 function getData($q) {
  var getMessages = function(id) {
    var deferred = $q.defer();
    // deferred.notify('About to greet '   name   '.');
    GTS2_FIN_MU_Dist_Pct_Controller.getUltimates(
      id,
      function(result, event) {
        if (event.status) {
          //      console.log(result);
          var obj = JSON.parse(result);
          deferred.resolve(obj);
        } else {
          deferred.reject("Error Processing the Request :  "   event.message);
        }
      },
      { escape: false }
    );
    return deferred.promise;
  };
  return {
    getMessages: getMessages,
  };
}

app.factory("getData", getData);
  

Контроллер выглядит как:

 app.controller("intlMassUpdateDistPctController", function($scope) 
        { // define angular controller
        $scope.ultimates = new Array; // define empty array to hold ultimate versions from VF remote action
        // Calls controller method Remote Action and passes the ultimateId, and handles the result by storing it inside $scope.ultimateVersions
        $scope.loadData = function(){
            //$j214('#dialogNew').show();
            var promise = getData.getMessages('');  //Calling factory method.. This is where U get the error
            promise.then(function(obj) {
            $scope.selectedForecastLocked = false;
            var JSONdata = JSON.parse(obj);
            $scope.ultimates = JSONdata.Ultimates;
            $scope.gridOptions.api.setRowData($scope.ultimates);
                    ........
            }, function(reason) {
                        alert('Failed: '   reason);
                    }, function(update) {
                        alert('Got notification: '   update);
                    });
            }
        });     
  

Я также определил приложение.

 var app = angular.module('intlMassUpdateDistPct', ['agGrid','ui.bootstrap']);
  

И, наконец:

 <body ng-app="myApp" >
<div ng-controller="intlMassUpdateDistPctController">
  

Может кто-нибудь, пожалуйста, помочь мне определить, чего не хватает.

Комментарии:

1. Вы не забыли ввести завод в контроллер (как вы сделали с $ scope)?

2. @PJDev Большое спасибо. Я не могу поверить, что пропустил внедрение factory.

3. Нет проблем. Кстати, на вашем месте я бы рассмотрел возможность использования ввода массива строк вместо простого ввода аргументов: app.controller("intlMassUpdateDistPctController", ['$scope', 'getData', function($scope, getData) { ... }]) . Если вы когда-нибудь решите минимизировать файлы JS с помощью вашего подхода, все будет нарушено, потому что всем аргументам будут присвоены случайные имена. Подход string array защитит вас от этого 😉

4. @PJDev : Не так, если он использует gulp-ng-annotate . Это может быть сделано любым способом

Ответ №1:

Попробуйте внедрить getData factory в контроллер :

 app.controller("intlMassUpdateDistPctController", function($scope,getData){
   // your code...
})