Je suis nouveau sur AngularJS
et j'essaie d'obtenir le texte et la valeur sélectionnés de Dropdown
. J'ai suivi beaucoup de tutoriels avec toujours impossible d'y arriver. SelectedValue
et SelectedText
sont toujours undefined
. Ci-dessous mon code:
Html:
<div ng-app="SelectApp">
<div ng-controller="selectController">
<select name="category-group" id="categoryGroup" class="form-control" ng-model="itemSelected" ng-change="onCategoryChange(itemSelected)">
<option value="0">Select a category...</option>
<option ng-repeat="category in categories" value="{{category.id}}"
ng-disabled="category.disabled" ng-class="{'mainCategory' : category.disabled}">
{{category.name}}
</option>
</select>
</div>
Js:
'use strict';
var app = angular.module('SelectApp', [ ]);
app.controller('selectController', ['$scope', '$window', function ($scope, $window) {
$scope.categories = [
{ id: 1, name: "- Vehicles -", disabled: true },
{ id: 2, name: "Cars" },
{ id: 3, name: "Commercial vehicles", disabled: false },
{ id: 4, name: "Motorcycles", disabled: false },
{ id: 5, name: "Car & Motorcycle Equipment", disabled: false },
{ id: 6, name: "Boats", disabled: false },
{ id: 7, name: "Other Vehicles", disabled: false },
{ id: 8, name: "- House and Children -", disabled: true },
{ id: 9, name: "Appliances", disabled: false },
{ id: 10, name: "Inside", disabled: false },
{ id: 11, name: "Games and Clothing", disabled: false },
{ id: 12, name: "Garden", disabled: false }
];
$scope.onCategoryChange = function () {
$window.alert("Selected Value: " + $scope.itemSelected.id + "\nSelected Text: " + $scope.itemSelected.name);
};
}]);
Et encore une chose, j'ai défini mon premier élément comme étant Select a category...
puis Pourquoi le premier élément dans le menu déroulant est toujours vide.
Ci-dessous, mon échantillon de violon . http://jsfiddle.net/Qgmz7/136/
En effet, votre modèle itemSelected
capture la valeur actuelle de votre liste déroulante de sélection, qui n’est autre que l’attribut value
de votre élément option
. Tu as
<option ng-repeat="category in categories" value="{{category.id}}">
dans votre code, donc dans la version rendue, vous aurez
<option ng-repeat="category in categories" value="0">
mais vous vous attendez à ce que itemSelected
soit votre objet de catégorie et toute tentative d'interrogation de id
ou d'une autre propriété retournera undefined
.
Vous pouvez utiliser ng-options
avec group by
avec un peu de modification de vos données ou vous pouvez utiliser ng-repeat
normal, obtenir le selectedIndex et rechercher l'objet catégorie de votre liste de catégories à l'aide de cet index. Présentant la première approche ici.
HTML
<select name="category-group" id="categoryGroup"
ng-model="itemSelected" ng-change="onCategoryChange(itemSelected)"
ng-options="category.name group by category.group for category in categories">
</select>
Données mises à jour
$scope.categories = [
{ id: 0, name: "Select a category..."},
{ id: 1, name: "Cars", group : "- Vehicles -" },
{ id: 2, name: "Commercial vehicles", group : "- Vehicles -" },
{ id: 3, name: "Motorcycles", group : "- Vehicles -" }
];
$scope.itemSelected = $scope.categories[0];
Au lieu d'une propriété désactivée, vous pouvez ajouter une propriété group
pouvant être utilisée dans group by
.
Voici une mise à jour Fiddle pour illustrer l'idée.
Vous devez utiliser ng-options
pour définir l'objet sur votre valeur ng-model
lors de la modification de vos options de sélection.
Balisage
<select name="category-group" id="categoryGroup" class="form-control"
ng-model="itemSelected" ng-change="onCategoryChange(itemSelected)"
ng-options="category.name for category in categories">
<option value="0">Select a category...</option>
</select>
Mettre à jour
Pour conserver le style, vous devez utiliser ng-repeat
dans ce cas. Dans ce cas, vous n'aurez que id
lié à votre ng-model
et lors de la récupération de tout l'objet, vous devez filtrer vos données.
$scope.onCategoryChange = function () {
var currentSelected = $filter('filter')($scope.categories, {id: $scope.itemSelected})[0]
$window.alert("Selected Value: " + currentSelected.id + "\nSelected Text: " + currentSelected.name);
};
<div ng-app="SelectApp">
<div ng-controller="selectController">
<select ng-change='onCategoryChange()' ng-model="itemSelected" ng-options="category.name for category in categories">
<option value="">-- category --</option>
</select>
</div>
Un petit changement dans votre onCategoryChange()
devrait fonctionner:
$scope.onCategoryChange = function () {
$window.alert("Selected Value: " + $scope.categories[$scope.itemSelected - 1].id + "\nSelected Text: " + $scope.categories[$scope.itemSelected -1].name);
};
JSFiddle: http://jsfiddle.net/Qgmz7/144/
ngChange
ne renvoie que la valeur de l'option sélectionnée et c'est pourquoi vous n'obtenez pas l'intégralité des données.
Voici une solution de travail sans changer votre logique de balisage.
Balisage:
<select
name="category-group"
id="categoryGroup"
class="form-control"
ng-model="id"
ng-change="onCategoryChange(id)">
Gestionnaire ngChange:
$scope.onCategoryChange = function (id) {
//get selected item data from categories
var selectedIndex = $scope.categories.map(function(obj) { return obj.id; }).indexOf( parseInt(id) );
var itemSelected = $scope.categories[selectedIndex];
$window.alert("Selected Value: " + itemSelected.id + "\nSelected Text: " + itemSelected.name);
};
Une autre solution (un peu sale) serait de ne changer que la value
de vos options en quelque chose comme ceci:
<option .... value="{{category.id}}|{{category.name}}">
... et dans votre gestionnaire ngChange actuel, divisez la valeur pour obtenir toutes les valeurs sous forme de tableau:
$scope.onCategoryChange = function (itemSelected) {
$scope.itemSelected = itemSelected.split('|'); //string value to array
$window.alert("Selected Value: " + $scope.itemSelected[0] + "\nSelected Text: " + $scope.itemSelected[1]);
};
Voici un code très simple et facile Ce que j'ai fait
<div ng-app="myApp" ng-controller="myCtrl">
Select Person:
<select ng-model="selectedData">
<option ng-repeat="person in persons" value={{person.age}}>
{{person.name}}
</option>
</select>
<div ng-bind="selectedData">AGE:</DIV>
<br>
</div>
<script>
var app = angular.module('myApp', []);
app.controller('myCtrl',myCtrlFn);
function myCtrlFn($scope) {
$scope.persons =[
{'name': 'Prabu','age': 20},
{'name': 'Ram','age': 24},
{'name': 'S','age': 14},
{'name': 'P','age': 15}
];
}
</script>