我在AngularJS中编写了以下工厂服务,但是当我尝试在RootController中调用工厂服务时,我的控制台中出现了“undefined is a function”错误。
MyService.js:
(function() {
angular.module('serviceTestApp')
.factory('MyService', ['$resource', '$log', '$q', '$http', MyService]);
function MyService($log, $resource, $http, $q) {
var name = "Tom";
var getName = function() {
return name;
}; //getName
var changeName = function(newName) {
name = newName;
}; //changeName
var getIP = function() {
var deferredObj = $q.defer();
$resource('http://jsonip.com').query().$promise.then(function(result) {
deferredObj.resolve(result);
}, function(errorMsg) {
deferredObj.reject(errorMsg);
});
return deferredObj.promise;
}; //getIP
return {
getName: getName,
changeName: changeName,
getIP: getIP
};
}
}());
在我的RootController中,我尝试调用服务,一切正常,直到我调用getIP()服务 - 返回一个promise对象。有没有人看错了什么?
RootController.js:
(function() {
angular.module('serviceTestApp')
.controller('RootCtrl', ['$http', '$log', '$scope', 'MyService', RootCtrl]);
function RootCtrl($log, $scope, $http, MyService) {
var vm = this;
vm.message = "hello world from RootController";
MyService.changeName("Henry Tudor");
vm.message = "my name is: " + MyService.getName();
MyService.getIP().query().then(function(data) {
$log.info('in the promise, ip is: ' + data.ip);
vm.message = vm.message + ', your IP is ' + data.ip;
}, function(error) {
vm.message = vm.message + ', error: ' + error;
});
}
}());
答案 0 :(得分:1)
这可能听起来很愚蠢,但我找到了错误的原因:
$ resource()中使用的API返回一个JSON对象:
{"ip":"2601:0:b840:8077:a97f:ee9c:f5b8:1643","about":"/about","Pro!":"http://getjsonip.com"}
但是,query()需要一个数组,而不是JSON对象。 更改为另一个以JSON格式返回数组的API后,它可以正常工作。叹了口气,浪费了我2个小时。
谢谢大家
答案 1 :(得分:0)
为了使用您的服务
MyService.getName()
表示您拥有名为MyService
的服务并返回名为getName
但在你的情况下,你不必改变 你回到那样的
return {
getName: function() {return getName();},
changeName: function() {return changeName();},
getIP: function() {return getIP();}
};