Angularjs 服务注入问题
Angularjs Service Injection Issue
我第一次尝试向我的 Angular 项目添加服务,运行 遇到将它注入我的控制器的问题。
我收到一个错误 --
TypeError: Cannot read property 'get' of undefined
我正在寻求将服务正确注入控制器以及改进代码的最佳方式 practices/efficiency。
感谢您的帮助!
我的 angular 项目中有一个文件夹 /event,其中包含以下文件 --
app.js
controllers.js
directives.js
services.js
app.js 文件有 --
'use strict';
angular.module('vyrt.event', [
'vyrt.event.controllers',
'vyrt.event.services',
'vyrt.event.directives'
]);
services.js 文件有--
'use strict';
angular.module('vyrt.event.services', []).
service('VyrtEventService', ['$http', function($http) {
var artistId = 0,
artist = '',
events = [],
active_event_idx = 0;
this.get = function(artistId) {
var url = '/api/users/' + artistId + '/';
$http.get(url).success(function(data, status, headers, config) {
artist = data.artist.user;
events = data.artist.events;
active_event_id = data.artist.events[0].id;
});
return artist, events, active_event_id;
}
}]);
最后,控制器有--
'use strict';
angular.module('vyrt.event.controllers', []).
controller('VyrtEventCtrl', ['$scope', function($scope, VyrtEventService) {
console.log(VyrtEventService.get($scope.artistId));
$scope.activeCampaign = function(idx) {
if (idx == VyrtEventService.active_event_idx) return true;
return false;
};
}]);
问题是您在定义控制器时忘记将 'VyrtEventService' 放入依赖项列表中:
.controller('VyrtEventCtrl', ['$scope', /* you need this ==>*/ 'VyrtEventService', function($scope, VyrtEventService) {
console.log('VyrtEventService', VyrtEventService);
$scope.activeCampaign = function(idx) {
if (idx == VyrtEventService.active_event_idx) return true;
return false;
};
}]);
更新
您的 get()
函数有几个问题。首先,您需要 return $http.get()
调用自身,然后您可以在您的控制器中调用 then()
并在您的 $scope
上将结果设置为 属性 .其次,您不能 return 多个这样的值。您将必须 return 一个值数组或一个分配了您想要的值的对象。
服务
this.get = function(artistId) {
var url = '/api/users/' + artistId + '/';
return $http
.get(url)
.catch(function(error){
// handle errors here
console.log('Error fething artist data: ', error);
});
}
控制器
VyrtEventService
.get(artistId)
.then(function(data){
$scope.artist = data.artist.user;
$scope.events = data.artist.events;
$scope.active_event_id = data.artist.events[0].id;
});
$scope.activeCampaign = function(idx) {
return (idx == $scope.active_event_idx);
};
我第一次尝试向我的 Angular 项目添加服务,运行 遇到将它注入我的控制器的问题。
我收到一个错误 --
TypeError: Cannot read property 'get' of undefined
我正在寻求将服务正确注入控制器以及改进代码的最佳方式 practices/efficiency。 感谢您的帮助!
我的 angular 项目中有一个文件夹 /event,其中包含以下文件 --
app.js
controllers.js
directives.js
services.js
app.js 文件有 --
'use strict';
angular.module('vyrt.event', [
'vyrt.event.controllers',
'vyrt.event.services',
'vyrt.event.directives'
]);
services.js 文件有--
'use strict';
angular.module('vyrt.event.services', []).
service('VyrtEventService', ['$http', function($http) {
var artistId = 0,
artist = '',
events = [],
active_event_idx = 0;
this.get = function(artistId) {
var url = '/api/users/' + artistId + '/';
$http.get(url).success(function(data, status, headers, config) {
artist = data.artist.user;
events = data.artist.events;
active_event_id = data.artist.events[0].id;
});
return artist, events, active_event_id;
}
}]);
最后,控制器有--
'use strict';
angular.module('vyrt.event.controllers', []).
controller('VyrtEventCtrl', ['$scope', function($scope, VyrtEventService) {
console.log(VyrtEventService.get($scope.artistId));
$scope.activeCampaign = function(idx) {
if (idx == VyrtEventService.active_event_idx) return true;
return false;
};
}]);
问题是您在定义控制器时忘记将 'VyrtEventService' 放入依赖项列表中:
.controller('VyrtEventCtrl', ['$scope', /* you need this ==>*/ 'VyrtEventService', function($scope, VyrtEventService) {
console.log('VyrtEventService', VyrtEventService);
$scope.activeCampaign = function(idx) {
if (idx == VyrtEventService.active_event_idx) return true;
return false;
};
}]);
更新
您的 get()
函数有几个问题。首先,您需要 return $http.get()
调用自身,然后您可以在您的控制器中调用 then()
并在您的 $scope
上将结果设置为 属性 .其次,您不能 return 多个这样的值。您将必须 return 一个值数组或一个分配了您想要的值的对象。
服务
this.get = function(artistId) {
var url = '/api/users/' + artistId + '/';
return $http
.get(url)
.catch(function(error){
// handle errors here
console.log('Error fething artist data: ', error);
});
}
控制器
VyrtEventService
.get(artistId)
.then(function(data){
$scope.artist = data.artist.user;
$scope.events = data.artist.events;
$scope.active_event_id = data.artist.events[0].id;
});
$scope.activeCampaign = function(idx) {
return (idx == $scope.active_event_idx);
};