Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何使一个服务依赖于另一个服务值_Angularjs - Fatal编程技术网

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;
    }
]);