在config中使用带有$ http调用的ownProvider

时间:2017-08-28 14:43:38

标签: angularjs http config angular-translate provider

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

但我读过的主题都没有显示如何在config()内的提供程序中实际使用API​​调用中收集的信息。

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

(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行(脚本的底部)我返回值,我不知道它是否真的是一个很好的方法,这是我第一次尝试这个并需要你的帮助。

接下来在名为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行,我设置了一个prefferedLenguage,我希望这是一个在自己的提供者中返回的值:homeCountryLower

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

2 个答案:

答案 0 :(得分:1)

我建议你把api调用解决这个问题。这将确保您的git reflog local ,直到服务调用完成。

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,您可以在整个应用程序中重复使用它,因为它本质上是单身。

答案 1 :(得分:0)

我得出的结论是,无法在config()中使用来自后端呼叫的收集信息。也许有可能使用某种具有resolve功能的黑客,但我无法弄明白。

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

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

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

我为将来会涉及这个话题的人写了这个。