2014-10-28 4 views
3

Я пытаюсь использовать i18next (https://github.com/archer96/ng-i18next) в своем проекте Angular, но, похоже, он загружается слишком медленно. Это моя настройка:Как дождаться загрузки модуля Angular?

angular.module('jm.i18next').config(['$i18nextProvider', function ($i18nextProvider) { 
    $i18nextProvider.options = { 
     lng: 'en', 
     fallbackLng: 'en', 
     preload: ['en'], 
     supportedLngs: ['en'], 
     resGetPath: '../locales/__lng__.json', 
     useCookie: false, 
     useLocalStorage: false, 
     defaultLoadingValue: '' 
    }; 
}]); 

angular.module('myApp', ['jm.i18next']).controller('MainCtrl', ['$scope', '$i18next', function ($scope, $i18next) { 
console.log($i18next("key")); 

setTimeout(function() { 
    console.log($i18next("key")); 
    }, 1000); 
}]); 

Я должен добавить таймаут, чтобы иметь значение. Есть ли способ убедиться, что i18next готов, когда контроллер загружен?


UPDATE

Я пытаюсь группы тренировок по типу, который переводится с помощью $ i18next. Но это не работает, поскольку представление «готово», прежде чем контроллер выполнит перевод.

<select ng-model="workout" ng-options="workout as workout.name group by workout.type for workout in workouts | orderBy: ['type', 'name']"></select> 

$scope.workouts = [ 
    {id: 1, name: 'Workout 1', type: $i18next("type1")}, 
    {id: 25, name: 'Workout 2', type: $i18next("type2")}, 
    ]; 
+1

эй, разве ваш контроллер не связан с точкой зрения? Если это так, вы можете использовать решение на маршруте, чтобы дождаться загрузки модуля. Но обычно угловой будет ждать, пока все модули будут загружены до запуска ... Есть ли запрос ajax в этом модуле? –

+0

Связано с представлением, которое включает в себя поле выбора. Проблема заключается в том, что ng-options включает в себя список текстов i18next, и представление кажется «готовым» перед контроллером. Если это имеет смысл :) Я обновлю свое оригинальное сообщение. –

+1

поэтому в пути добавьте решение: {i18next: function (YourModule) {return YourModulePromise}} –

ответ

1

Это решило мою проблему.

angular.module('myApp', ['ngRoute', 'jm.i18next']). 
     config(['$routeProvider', function ($routeProvider) { 
      $routeProvider. 
       when('/route1', { 
        title: 'Route 1', 
        templateUrl: '../views/route1.html', 
        controller: 'Route1Ctrl', 
        resolve: { 
         i18next: function ($i18next) { 
         return $i18next; 
         } 
        } 
       }); 
    }]); 
+1

У меня была такая же проблема, и это исправлено. Хотя IMO это уродливое решение, потому что вам нужно поставить эту функцию разрешения на каждый маршрут ... – karantan

0

Вы можете также слушать i18nextLanguageChange события:

$scope.$on('i18nextLanguageChange', function() { 
    $scope.workouts = [ 
    {id: 1, name: 'Workout 1', type: $i18next("type1")}, 
    {id: 25, name: 'Workout 2', type: $i18next("type2")}, 
    ]; 
}); 

Вам придется решать и другие условия гонки на свой страх и таким образом.

Смежные вопросы