AngularJS выпадающий список onChange выбранный текст и значение
Я новичок в AngularJS и пытается получить выбранный текст и значение из Dropdown. Я следил за многими учебниками, но все еще не мог туда попасть. SelectedValue и SelectedText всегда undefined. Ниже приведен мой код:
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);
};
}]);
и еще одна вещь, я определил свой первый пункт как Select a category... тогда почему первый элемент в раскрывающемся списке всегда пуст. 
ниже-моя скрипка образец. http://jsfiddle.net/Qgmz7/136/
6 ответов
это потому, что ваша модель itemSelected захватывает текущее значение вашего выбора выпадающего списка, который является ничем иным, как 
вы должны использовать ng-options установить объект в ng-model значение при изменении вы выбираете параметры.
разметки
<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>
обновление
для сохранения стиля нужно использовать ng-repeat там, в этом случае у вас будет только id привязкой к вашему ng-model и при получении всего объекта нужно фильтровать данные.
$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>
небольшое изменение в вашем onCategoryChange() должно работать:
$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 возвращает только значение выбранного параметра и поэтому вы не получаете всей информации.
вот рабочее решение без изменения логики разметки.
разметка:
<select
    name="category-group"
    id="categoryGroup"
    class="form-control"
    ng-model="id"     
    ng-change="onCategoryChange(id)">
обработчик 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);
    };
другим решением (немного грязным) было бы изменить только value из ваших вариантов в что-то вроде этого:
<option .... value="{{category.id}}|{{category.name}}">
...и внутри фактический обработчик ngChange, просто разделите значение, чтобы получить все значения в виде массива:
$scope.onCategoryChange = function (itemSelected) {
    $scope.itemSelected = itemSelected.split('|'); //string value to array
    $window.alert("Selected Value: " + $scope.itemSelected[0] + "\nSelected Text: " + $scope.itemSelected[1]);
};
здесь очень простой и легкий код, что я сделал
<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>
