Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.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
Javascript AngularJS-routeProvider解析调用服务方法_Javascript_Angularjs - Fatal编程技术网

Javascript AngularJS-routeProvider解析调用服务方法

Javascript AngularJS-routeProvider解析调用服务方法,javascript,angularjs,Javascript,Angularjs,我已经创建了一个检查用户登录状态的服务(如果令牌存在,请登录用户,否则重定向到登录页面) 最初,我通过routeProvider resolve调用了该服务——这只运行了一次,但由于Angularjs服务是单例的,所以测试不会连续运行 然后,我尝试将测试移动到返回对象中的一个方法中,但我似乎无法让routeProvider解析调用服务的特定方法(这在某种程度上是有意义的) 问题是,如何确保每次加载路由时都执行测试 在egghead视频系列()中,他使用了一个分配给控制器的函数,但这似乎不是生产应

我已经创建了一个检查用户登录状态的服务(如果令牌存在,请登录用户,否则重定向到登录页面)

最初,我通过routeProvider resolve调用了该服务——这只运行了一次,但由于Angularjs服务是单例的,所以测试不会连续运行

然后,我尝试将测试移动到返回对象中的一个方法中,但我似乎无法让routeProvider解析调用服务的特定方法(这在某种程度上是有意义的)

问题是,如何确保每次加载路由时都执行测试


在egghead视频系列()中,他使用了一个分配给控制器的函数,但这似乎不是生产应用程序的正确解决方案(我不想将函数分配给特定的控制器,我相信Angularjs依赖注入不会起作用).

服务是单例意味着只有一次初始化,但如果您只是从服务返回,它将被调用一次,但如果您从服务返回函数,它将被调用一次又一次。请参阅下面的工作示例

var app = angular.module('ajay.singhApp', [])
  .config(['$routeProvider', function($routeProvider) {
    $routeProvider
      .when('/view1', {
        templateUrl: 'views/main.html',
        controller: 'MainCtrl',
        resolve: {
            myVar: function (repoService) {
                return repoService.getItems().then(function (response) {
                    return response.data;
                });
            }
        }
      })
        .when('/view2', {
            templateUrl: 'views/main.html',
            controller: 'MainCtrl'
        })
      .otherwise({
        redirectTo: '/view1'
      });
  }]);


app.factory('repoService', function ($http) {
    return {
        getItems: function () {
            return $http.get('TextFile.txt');
        }
    };
});

添加到@Ajay的响应中,您可以使用字符串而不是标准属性名,这将有助于缩小:

resolve: {
    'myVar': function (repoService) {
        return repoService.getItems().then(function (response) {
            return response.data;
        });
    }
}

谢谢,行得通。虽然这仍然感觉像是一个工作。希望有一个更简单的解决方案:(如何使用返回的response.data?在您的控制器中,在本例中是MainCtrl,将$route作为依赖项注入,$route.current.locals.myVar将包含数据。更好的是,如果您将'data'作为其依赖项注入控制器,它将是解析的数据。此代码在缩小后是否可以工作?据我所知
myVar:函数(repoService)
一旦缩小就会停止工作,要解决这个问题,您需要显式地处理repoService的注入。或者我错了?参数注入数组表示法呢?缩小将破坏示例代码,函数的重命名将完成?当然我可以使用$inject,但这并不容易。。。