Ceci est mon angular html. Dans ma base de données mongo frequencyType
ajouté comme frequencyType = "1"
Mais je veux frequencyType = NumberInt(1);
<div class="span4">
<select class="span12 combobox" ng-model="frequencyType" required>
<option value="1">Daily</option>
<option value="2">Weekly</option>
<option value="3">Monthly</option>
<option value="4">Yearly</option>
</select>
</div>
Je reçois dans ma base de données frequencyType = "1"
Mais je veux frequencyType = NumberInt(1)
.
Je vous suggère d'essayer d'utiliser indexOf
.
[~ # ~] js [~ # ~]
function MyCtrl($scope) {
$scope.values = ["Daily","Weekly","Monthly","Yearly"];
$scope.selectedItem = 0;
}
[~ # ~] html [~ # ~]
<div ng-app ng-controller="MyCtrl">
<select ng-model="selectedItem" ng-options="values.indexOf(selectedItem) as selectedItem for selectedItem in values"></select>
selectedItem: {{selectedItem}}
</div>
Démo Fiddle
Alors envoyez à mongoDB $scope.selectedItem
valeur
Il existe un moyen plus simple:
Utilisez simplement value*1
comme votre id, qui convertira la chaîne en int sans changer la valeur ... en supposant que l'id est un entier.
donc le résultat est>
<div ng-app ng-controller="MyCtrl">
<select ng-model="selectedItem" ng-options="selectedItem*1 as selectedItem for selectedItem in values"></select>
selectedItem: {{selectedItem}}
</div>
Cela fonctionnera dans plus de cas, car indexOf n'est pas disponible dans les objets, uniquement dans les tableaux. Cette solution fonctionne pour les objets avec des entiers comme clés (par exemple si certaines clés sont manquantes ou si vous utilisez des identifiants db)
La plupart des solutions discutées ici nécessitent l'utilisation de la directive ngOptions au lieu d'utiliser statique <option>
éléments dans le code HTML, comme c'était le cas dans le code de l'OP.
Modifier Si vous utilisez Angular 1.6.x, utilisez simplement la directive ng-value et cela fonctionnera comme prévu.
angular.module('nonStringSelect', [])
.run(function($rootScope) {
$rootScope.model = { id: 2 };
})
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.0/angular.min.js"></script>
<div ng-app="nonStringSelect">
<select ng-model="model.id">
<option ng-value="0">Zero</option>
<option ng-value="1">One</option>
<option ng-value="2">Two</option>
</select>
{{ model }}
</div>
Il y a est un moyen de le faire fonctionner tout en utilisant des éléments statiques. Il est indiqué dans la documentation de la directive select AngularJS.
L'idée est d'utiliser une directive pour enregistrer un analyseur et un formateur sur le modèle. L'analyseur effectuera la conversion chaîne-en-int lorsque l'élément est sélectionné, tandis que le formateur effectuera la conversion int-en-chaîne lorsque le modèle change.
Code ci-dessous (tiré directement de la page de documentation AngularJS, crédit pas le mien).
angular.module('nonStringSelect', [])
.run(function($rootScope) {
$rootScope.model = { id: 2 };
})
.directive('convertToNumber', function() {
return {
require: 'ngModel',
link: function(scope, element, attrs, ngModel) {
ngModel.$parsers.Push(function(val) {
return parseInt(val, 10);
});
ngModel.$formatters.Push(function(val) {
return '' + val;
});
}
};
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<div ng-app="nonStringSelect">
<select ng-model="model.id" convert-to-number>
<option value="0">Zero</option>
<option value="1">One</option>
<option value="2">Two</option>
</select>
{{ model }}
</div>
Je viens d'avoir le même problème et j'ai trouvé la bonne façon de le faire - pas de "magie" requise. :)
function MyCtrl($scope) {
$scope.values = [
{name : "Daily", id : 1},
{name : "Weekly", id : 2},
{name : "Monthly", id : 3},
{name : "Yearly", id : 4}];
$scope.selectedItem = $scope.values[0].id;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.min.js"></script>
<div ng-app ng-controller="MyCtrl">
<select ng-model="selectedItem" ng-options="selectedItem.id as selectedItem.name for selectedItem in values"></select>
selectedItem: {{selectedItem}}
</div>
Je pense que la manière angular pour ce faire est d'utiliser la directive "convert-to-number" dans la balise select.
<select class="span12 combobox" ng-model="frequencyType" required convert-to-number>
<option value="1">Daily</option>
<option value="2">Weekly</option>
<option value="3">Monthly</option>
<option value="4">Yearly</option>
</select>
Vous pouvez voir la documentation et un violon ici à la fin de la page: https://docs.angularjs.org/api/ng/directive/select
C'est le moyen le plus simple que j'ai trouvé jusqu'à présent:
function Controller($scope) {
$scope.options = {
"First option" : 1,
"Second option" : 2,
"Last option" : 10
}
$scope.myoption = 2;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app ng-controller="Controller">
<select ng-model="myoption" ng-options="label for (label, value) in options"></select>
Option Selected: {{myoption}}
</div>
Ou, si vous souhaitez utiliser des index numériques:
function Controller($scope) {
$scope.options = {
1 : "First option",
2 : "Second option",
10 : "Last option"
}
$scope.myoption = 2;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app ng-controller="Controller">
<select ng-model="myoption" ng-options="value*1 as label for (value, label) in options"></select>
Option Selected: {{myoption}}
</div>
Pour Angular 2, suivez le rabit ...