web-dev-qa-db-fra.com

Comment ng-traduire à l'intérieur de l'option de sélection dans angularjs

Comment appliquer ng-translate pour traduire les options dans une boîte de sélection.
Par exemple:

Modèle:

<select class="form-control" ng-model="me.gender" ng-options="gender.name for gender in genders">
</select>

Manette:

$scope.genders = [{code: "M", name:"TXT_MALE"}, {code: "F", name:"TXT_FEMALE"}]

enUS.json:

{
    "TXT_MALE": "Male",
    "TXT_FEMALE": "Female",
}

J'ai essayé d'ajouter un filtre comme ng-options="gender.name for gender in genders | translate" mais de toute évidence, il ajoutait un filtre à $scope.genders tableau au lieu d'un seul élément

J'ai essayé d'écrire mon propre filtre (je suis nouveau dans ce domaine)

filter('translateArrayObj', ['$translate', '_', function($translate, _) {
  return function(arr) {
    var arr2 = [];
    angular.forEach(arr, function (value, key) {
      $translate(value.name).then(function(translation) {
        var obj2 = angular.copy(value);
        obj2.name = translation;
        obj2.code = value.code;
        arr2.Push(obj2);
      });
    });
    return arr2;
  }
}])

Mais j'ai eu l'erreur suivante

Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!

Cela semble être une tâche simple mais cela a déjà pris la moitié de ma journée, que fais-je de mal: (

46
Rahul Prasad

Vous devez appliquer le filtre à gender.name et non au tableau genders:

<select ng-model="me.gender" ng-options="gender.name | translate for gender in genders"></select>

Voici une démo

94
Sebastian

Une autre méthode plus simple en utilisant md-select, ici l'espace réservé est également utilisé

JSON: "placeholder":{ "gender": "Gender" }, "gender": { "TXT_MALE": "Male", "TXT_FEMALE": "Female" }

Code HTML:

<md-select ng-model="gender" placeholder="{{'placeholder.gender' | translate}}" ng-required="true" style="width: 160px;" >
    <md-option ng-value="gender .code" ng-repeat="gender in genders" translate="gender.{{gender.name}}"></md-option>
</md-select>
0
Antony Joslin