Angularjs 如何使一个服务依赖于另一个服务值
好的,我有这个服务,它依赖于用户可以在应用程序界面中更改的另一个服务值。大概是这样的:Angularjs 如何使一个服务依赖于另一个服务值,angularjs,Angularjs,好的,我有这个服务,它依赖于用户可以在应用程序界面中更改的另一个服务值。大概是这样的: app.service('Applications', ['$resource', 'URL', function ($resource, URL) { var applicationsResource = $resource(URL + '/applications/:id', { id: '@id' }, { query: {
app.service('Applications', ['$resource', 'URL',
function ($resource, URL) {
var applicationsResource = $resource(URL + '/applications/:id', { id: '@id' }, {
query: {
method: 'GET',
isArray: true,
transformResponse: function(body, header) {
var response = angular.fromJson(body);
return response.data.applications;
}
}
});
var applications = applicationsResource.query(function() {
applications.current = applications[0];
});
return applications;
}
]);
app.service('Users', ['$resource', 'URL', 'Applications',
function ($resource, URL, Applications) {
return $resource(URL + '/users/:id', { id: '@id' }, {
query: {
method: 'GET',
isArray: true,
headers: {
'User': Applications.current.username,
'Pass': Applications.current.password
},
transformResponse: function(body, header) {
var response = angular.fromJson(body);
return response.data.users;
}
}
});
}
]);
工作控制器代码示例:
app.controller('usersController', ['$scope', '$resource', 'URL', 'Applications',
function ($scope, $resource, URL, Applications) {
$scope.users = [];
$scope.reload = function() {
$scope.loading = true;
var usersResource = $resource(URL + '/users/:id', { id: '@id' }, {
query: {
method: 'GET',
isArray: true,
headers: {
'User': Applications.current.username,
'Pass': Applications.current.password
},
transformResponse: function(body, header) {
var response = angular.fromJson(body);
return response.data.users;
}
}
});
$scope.users = usersResource.query(function() {
$scope.loading = false;
});
/*
// after injecting Users, this is what I want to do, instead of what's above
$scope.users = Users.query(function() {
$scope.userTable.reload();
$scope.loading = false;
});
*/
};
$scope.$watch('Applications.current', function (newApplication, oldApplication, scope) {
if (newApplication && newApplication !== oldApplication) {
scope.reload();
}
});
}
]);
我想用我的Users服务替换usersResource,但这就是我现在的困境所在
问题是,无论我做什么,用户服务上的Applications.current始终为空。我仅在确保控制器上的Applications.current不为null后才使用此服务
如果我将资源直接移动到控制器,它会工作,但我希望将这些资源从控制器移开
关于如何修复或改进此问题的任何提示?您应该知道$resource是异步的,并且在实际收到服务器和填充的应用程序的响应之前调用用户服务。current。这就是Applications.current在用户服务中为null的原因
在您的情况下,我将在应用程序中使用服务:
在从服务器获得任何结果之前,我不会调用用户服务。在控制器上,我有如下内容:如果Applications.current$scope.users=users.queryfunction{/*失败,因为Applications.current为null*/}您是否检查了Applications.current在控制器上是否有username/pswd?请参阅我的编辑,我认为您需要在应用程序中使用用户,因为应用程序是根服务,因为当前应用程序可能会更改,所以它实际上不起作用。这就是为什么我在controllerPlease post User call中有那块手表,相关的控制器代码用一个工作的控制器代码编辑,以演示我想要的。好的,请在它不工作时发布如何调用服务。ThanksI已经添加了一条带有预期代码的注释
app.service('Applications', ['$resource', 'URL', 'Users',
function ($resource, URL, Users) {
var applicationsResource = $resource(URL + '/applications/:id', { id: '@id' }, {
query: {
method: 'GET',
isArray: true,
transformResponse: function(body, header) {
var response = angular.fromJson(body);
return response.data.applications;
}
}
});
var applications = applicationsResource.query(function() {
applications.current = applications[0];
// call the Users
Users.query(applications.current) /**/
return /* ... */;
});
return applications;
}
]);