在配置中使用带有 $http 调用的 ownProvider

Use ownProvider with $http call inside config

我已经阅读了很多关于 SO 的信息,我无法在配置中调用 $http 但我可以做的是创建自己的提供程序并在配置中使用此提供程序。

但是我阅读的 none 主题展示了如何实际使用在 API 调用 config() 中收集的信息。

所以我创建的提供者是这样的:

(function () {
    'use strict';

    angular
        .module('app', [])
        .provider('translateOwnProvider', Provider);

    function Provider () {
        this.$get = function($http) {

            $http({
                url: 'http://ipinfo.io/json',
                method: 'GET'
            })
            .then(function(response) {
                var homeCountry = response.data.country;
                var homeCountryLower = homeCountry.toLowerCase();
                console.log(response.data);
            }, function(errorCall) {
                console.log("error");
            });

            return homeCountryLower;
            // ?????
        };
    };

})();

所以在第 23 行(脚本底部)我 return 值,我不知道这是否真的是一个好方法,这是我第一次尝试这个,需要你们的帮助.

下一个配置文件名为 really common app.js 我有配置

密码是:

(function () {
    'use strict';

    angular
        .module('app', [
            'ngRoute',
            'pascalprecht.translate'
        ])
        .config(config);

    //$inject for minify issue
    config.$inject = ['$routeProvider', '$translateProvider', 'translateOwnProvider'];

    function config ($routeProvider, $translateProvider, translateOwnProvider) {
        $routeProvider
            .when('/', {
                controller: 'mainCtrl',
                templateUrl: 'views/main.html'
            })
            .otherwise('/');

        // add translation tables
         $translateProvider.translations('en', translationsEN);
         $translateProvider.translations('de', translationsDE);
         $translateProvider.translations('pl', translationsPL);

         // preferredLanguage is gather should be gather in provider
         $translateProvider.preferredLanguage('en');

         $translateProvider.fallbackLanguage('en');
         //fallbackLanguage in case somebody hides his IP
    };


})();

在第 28 行中,我设置了一个 preferredLenguage,我希望这是一个值 returned in own provider:homeCountryLower.

目前我在控制台中没有任何错误,但这显然不起作用,页面根本没有加载,它保持空白。

我建议您将 api 调用用于解决此类问题。这将确保您的 app/main controller is not instantiated 直到服务调用完成。

resolve: {
    translateService: function($http, $route){
      return $http.get('http://ipinfo.io/json')
      .then(function(response){
        return response.data;
      })
    }
}

现在您可以 inject 控制器中的 translateService 并将其设置为 factory/service,您可以在整个应用程序中重复使用它,因为它本质上是单例的。

我得出的结论是无法在 config() 中使用从后端调用收集的信息。也许可以对 resolve 函数使用某种 hack,但我无法弄清楚。

我在 config() 中使用 window.navigator.language 而不是这个调用,所以现在我的翻译脚本不是基于用户 IP,而是基于用户浏览器语言。它不如 IP 令人满意,因为我仍然可以拥有来自波兰的用户并将浏览器设置为英语,然后我的页面将以英语显示。

我也可以编写自己的服务来为我翻译页面,但我真的很想使用 angular-翻译模块:link to module.

请注意,我使用的是 window.navigator.language 而不是 $window,因为第二个在 config() 中也无法实现。所以我的方案在测试的时候可能会出现一些问题。

我写这篇文章是为了将来会涉及到这个话题的任何人。