2017-08-28 116 views
0

我已經閱讀了大量的信息,使我不能有$http調用內部的配置,但我可以做的就是創建自己的提供和使用此提供一個配置裏面。

但這一切我讀到展示如何實際使用聚集在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行我返回值(腳本的底部),我不知道它實際上是這樣做的好方法,它是第一個我試過這個,需要你的幫助。

接下來在配置文件命名爲真正的共同app.js我有

  • 路由
  • 設置的用戶lenguage

代碼爲config:

(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,我希望這是一個自己提供的價值der:homeCountryLower

目前,我沒有在控制檯的任何錯誤,但這並不明顯工作,頁面沒有加載在所有的,它保持空白。

+0

*但這一切我看了展示如何實際使用中的供應商聚集在API調用的信息的配置裏面的主題()* - 因爲你不能。即使可以,這也會造成競爭條件,因爲HTTP請求是異步的。 – estus

+0

因此,基於用戶IP設置優先用戶語言沒有解決方案嗎? – BT101

+0

正如答案所示,使用路由解析器。 – estus

回答

0

我完成了結論,那是不可能的使用從後端調用收集信息的config()。也許有可能用resolve函數進行某種破解,但我無法弄清楚。

我做的不是這個電話,而是我在我的config()中使用window.navigator.language,所以現在我的翻譯腳本不是基於用戶IP,而是基於用戶瀏覽器語言。它不像IP那麼令人滿意,因爲我仍然可以擁有來自波蘭的用戶,並將瀏覽器設置爲英文,然後我的頁面將以英文顯示。

我也可以寫自己的服務,它會爲我翻譯頁面,但我真的想用角轉換模塊:link to module

請注意,我使用window.navigator.language而不是$window,因爲第二個也不能在config()中實現。所以我的解決方案可能會在測試過程中造成一些問

我爲將來進入這個主題的任何人寫了這篇文章。

1

我建議你把API調用解決這樣的事情。這將確保您的​​,直到服務電話完成。現在

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

可以inject在控制器的translateService,並將其設置在factory/service,你可以爲它在本質上是單重複使用跨應用程序。

+0

但我不使用任何自己的服務或工廠和控制器來完成翻譯。我只是在第一個應用程序運行和語言表上設置語言,我通過''在index.html中添加。這個表格如下所示:https://gist.github.com/anonymous/8307d8f41acb1ebe638aa506ca338af7。翻譯是通過這個模塊來完成的:https://angular-translate.github.io/docs/#/guide/00_installation – BT101

+0

爲什麼你需要一個提供商在這裏translateOwnProvider,除非你打算設置defualt,以便translateService稍後的時候在整個應用程序中使用將具有此偏好。爲什麼不解決? – Thalaivar

+0

我需要這個提供者,因爲當某人來自英國知識產權或來自波蘭的IP時,我想設置prefferedLenguage爲英語,如果有人來自例如來自非洲的某個國家,我的應用不會使用'fallbackLanguage'處理。 – BT101