我对角度很新,并且尝试创建一个控制器,它将获得属于当前用户的所有Snod。我已经包含了我的CurrentUserController以供参考,但我的问题是关于SnodController,是我注入CurrentUser并嵌套调用正确的方式,因为虽然它有效但我看起来不对。
道歉,如果这是一个争论和违反规则的问题,但我想知道我是否正朝着正确的方向前进。
var apiService = angular.module("apiService", ['ngResource']);
apiService.factory('CurrentUser', function($resource) {
return $resource( "http://snodbert/api/v1/users/current/", {});
});
apiService.factory('Snod', function($resource) {
return $resource
( "http://snodbert/api/v1/snods/:filter/:filterid", {}
, { 'update': { method:'PUT' }
}
);
});
function CurrentUserController($scope, CurrentUser) {
var user = CurrentUser.get(function() {
$scope.user=user;
}
);
}
function SnodController($scope, Snod, CurrentUser) {
var user = CurrentUser.get(function() {
var items = Snod.get( {filter:'owner', filterid: user.id},
function() {
$scope.items=items.data;
});
});
}
答案 0 :(得分:1)
你的代码当然是有效的,但是,代码风格并不优雅,因为它的构建方式总是需要将回调嵌套到另一个...
为了解决这个问题,您可以了解Promise如何工作以及如何在AngularJS中实现它们:
因此,在阅读这些页面之后,您应该在如何解决Pyramid of doom 这个恼人的问题时有更明确的想法。
让我们快速修改您的基本代码:
// old
apiService.factory('CurrentUser', function($resource) {
return $resource( "http://snodbert/api/v1/users/current/", {});
});
// new
function CurrentUserServiceFactory($resource, $q) {
var resource = $resource("http://snodbert/api/v1/users/current/", {});
var self = this;
self.get = function() {
return resource
.get()
.$promise
;
}
}
apiService.service('CurrentUserService', CurrentUserServiceFactory);

function SnodController($scope, Snod, CurrentUserService) {
CurrentUserService
.get()
.then(function(userResult) {
return Snod.get({}).$promise;
})
.then(function(snodResult) {
console.log(snodResult);
})
;
}

另一件好事可能是重新组织你的代码,试图了解你的控制器有哪些依赖...对我来说,例如,CurrentUser
的值是一个依赖,它应该放在一个 route-resolve (resolves are explained here)。
使用resolve
,您可以直接执行此操作:
function SnodController($scope, Snod, CurrentUser) {
Snod
.get({userId: CurrentUser.id})
.$promise
.then(function(snodResult) {
console.log(snodResult);
})
;
}