#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...
})