2016-02-01 4 views
0

Я пытаюсь установить значение в $ rootScope в .run() и попытаться получить его в службе, но похоже, что он не определен. Все остальное в .run() и в сервисе работает нормально.

.run(function($ionicPlatform, $translate, $rootScope) { 
    document.addEventListener("deviceready",function(){ onDeviceReady($rootScope); }, false); 

    function onDeviceReady($rootScope) { 
    if(typeof navigator.globalization !== "undefined") { 
     navigator.globalization.getPreferredLanguage(function(language) { 
     $rootScope.language='en'; //(language.value).split('-')[0]; 
     $translate.use((language.value).split("-")[0]).then(function(data) { 
      console.log("SUCCESS -> " + data); 
     }, function(error) { 
      console.log("ERROR -> " + error); 
     }); 
     }, null); 
    } 
    } 
}) 


.service('Webcache', function ($http, $q, apiHost, $rootScope) { 
    return { 
     getDataBySection: function (section, version, params) { 
      var params = params || {}; 
      var host = apiHost; 
      var deferred = $q.defer(); 
      var start = new Date().getTime(); 

      params.lang = $rootScope.language; 

      $http.get('http://'+ host +'/api/'+ version +'/'+ section, { 
       cache: true, 
       params: params 
      }).success(function (response) { 
       deferred.resolve(response); 
      }).error(function (response){ 
       deferred.resolve(false); 
      }); 
      return deferred.promise; 
     } 
    }; 
}) 
+1

Я предполагаю, что событие 'deviceReady' не срабатывало в момент, когда вы пытаетесь его использовать. Лучшим решением было бы перевести язык из сферы действия и в службу и заставить службы использовать обещания для доступа к текущему языку (таким образом, метод 'getLanguage()', который возвращает обещание. Кроме того, не используйте устаревшие методы 'success',' error' в результате '$ http.get', просто используйте' then() ', и вы можете напрямую вернуть' response'. – Duncan

ответ

1

Вы не должны быть обязательными к onDeviceReady события на всех. Ионный дает вам угловой совместимый способ справиться с этим: $ionicPlatform.ready(), который возвращает обещание. Используя это сделает ваш код выглядит примерно так:

.run(function($ionicPlatform, $translate, $rootScope, $q, $log) { 
    $rootScope.languagePromise = $ionicPlatform.ready() 
    .then(function() { 
     return $q(function(resolve, reject) { 
      if(angular.isDefined(navigator.globalization)) { 
       navigator.globalization.getPreferredLanguage(function(language) { 
        $translate.use((language.value).split("-")[0]).then(function(data) { 
         $log.debug("SUCCESS -> " + data); 
         resolve(language); 
        }, function(error) { 
         $log.debug("ERROR -> " + error); 
         reject(error); 
        }); 
       }, null); 
      } else { resolve('en'); } 
     }); 
    }); 

}) 

Это ставит обещание в рамках которого вы можете использовать в любое время, чтобы получить язык либо сразу (если инициализация завершена), или когда он становится доступный.

.service('Webcache', function ($http, apiHost, $rootScope) { 
    return { 
     getDataBySection: function (section, version, params) { 
      params = params || {}; 
      var host = apiHost; 
      return $rootScope.languagePromise.then(function(language) { 
       params.lang = language; 
       return $http.get('http://'+ host +'/api/'+ version +'/'+ section, { 
        cache: true, 
        params: params 
       }).catch(function(){ 
        return false; 
       }); 
      }); 
     } 
    }; 
}) 

getDataBySection непосредственно метод возвращает результат ожидания на языке обещании, которое, в свою очередь, зависит от результата $http обещания, поэтому ответные данные будут распространяться обратно так же, как для существующего кода.

1

Похоже, устройство не готово, когда вы пытаетесь выполнить код, вы пробовали использовать $ionicPlatform.ready? что-то вроде этого:

.run(appRun); 
appRun.$inject = ['$ionicPlatform', '$translate', '$rootScope']; 
function appRun ($ionicPlatform, $translate, $rootScope) { 
    $ionicPlatform.ready(function() { 
     if(typeof navigator.globalization !== "undefined") { 
     navigator.globalization.getPreferredLanguage(function(language) { 
      $rootScope.language='en'; //(language.value).split('-')[0]; 
      $translate.use((language.value).split("-")[0]).then(function(data) { 
      console.log("SUCCESS -> " + data); 
      }, function(error) { 
      console.log("ERROR -> " + error); 
      }); 
     }, null); 
     } 
    }); 
}