Получить значение при выборе изменений ng-option
У меня на моей странице .html выпадающий список,
Выпадающее:
<select ng-model="blisterPackTemplateSelected" data-ng-options="blisterPackTemplate as blisterPackTemplate.name for blisterPackTemplate in blisterPackTemplates">
<option value="">Select Account</option>
</select>
Я хочу выполнить действие, когда пользователь выберет значение. Итак, в моем контроллере я сделал:
Контроллер:
$scope.$watch('blisterPackTemplateSelected', function() {
alert('changed');
console.log($scope.blisterPackTemplateSelected);
});
Но изменение значения в выпадающем списке не вызывает код: $scope.$watch('blisterPackTemplateSelected', function()
В результате я попробовал другой метод с: ng_change = 'changedValue()'
в теге select
и
Функция:
$scope.changedValue = function() {
console.log($scope.blisterPackTemplateSelected);
}
Но blisterPackTemplateSelected
сохраняется в дочерней области. Я прочитал, что родитель не может получить доступ к области содержимого.
Каков правильный/лучший способ выполнить что-либо при изменении выбранного значения в раскрывающемся списке? Если это метод 1, что я делаю неправильно с моим кодом?
Ответы
Ответ 1
поскольку Артем сказал, что вам нужно использовать ngChange и передать объект ngModel в качестве аргумента функции ngChange
Пример:
<div ng-app="App" >
<div ng-controller="ctrl">
<select ng-model="blisterPackTemplateSelected" ng-change="changedValue(blisterPackTemplateSelected)"
data-ng-options="blisterPackTemplate as blisterPackTemplate.name for blisterPackTemplate in blisterPackTemplates">
<option value="">Select Account</option>
</select>
{{itemList}}
</div>
</div>
JS:
function ctrl($scope) {
$scope.itemList = [];
$scope.blisterPackTemplates = [{id:1,name:"a"},{id:2,name:"b"},{id:3,name:"c"}];
$scope.changedValue = function(item) {
$scope.itemList.push(item.name);
}
}
Пример в реальном времени: http://jsfiddle.net/choroshin/9w5XT/4/
Ответ 2
Я могу опаздывать на это, но у меня была та же проблема.
Мне нужно было передать идентификатор и имя в мою модель, но все ортодоксальные решения заставили меня сделать код на контроллере для обработки этого изменения.
Я выбрал свой путь из него с помощью фильтра.
<select
ng-model="selected_id"
ng-options="o.id as o.name for o in options"
ng-change="selected_name=(options|filter:{id:selected_id})[0].name">
</select>
<script>
angular.module("app",[])
.controller("ctrl",['$scope',function($scope){
$scope.options = [
{id:1, name:'Starbuck'},
{id:2, name:'Appolo'},
{id:3, name:'Saul Tigh'},
{id:4, name:'Adama'}
]
}])
</script>
"Трюк" здесь:
ng-change="selected_name=(options|filter:{id:selected_id})[0].name"
Я использую встроенный фильтр для получения правильного имени для id
Здесь plunkr с рабочей демонстрацией.
Ответ 3
Пожалуйста, используйте для него директиву ngChange
.
Например:
<select ng-model="blisterPackTemplateSelected"
ng-options="blisterPackTemplate as blisterPackTemplate.name for blisterPackTemplate in blisterPackTemplates"
ng-change="changeValue(blisterPackTemplateSelected)"/>
И передайте новое значение модели в контроллере в качестве параметра:
ng-change="changeValue(blisterPackTemplateSelected)"
Ответ 4
Лучшей практикой является создание объекта (всегда используйте a. в ng-модели)
В вашем контроллере:
var myObj: {
ngModelValue: null
};
и в вашем шаблоне:
<select
ng-model="myObj.ngModelValue"
ng-options="o.id as o.name for o in options">
</select>
Теперь вы можете просто смотреть
myObj.ngModelValue
или вы можете использовать директиву ng-change так:
<select
ng-model="myObj.ngModelValue"
ng-options="o.id as o.name for o in options"
ng-change="myChangeCallback()">
</select>
Видео egghead.io "Dot" имеет действительно хороший обзор, так же как и этот очень популярный вопрос о переполнении стека: Каковы нюансы объема прототипа/прототипного наследования в AngularJS?
Ответ 5
Вы можете передать значение ng-модели через функцию ng-change в качестве параметра:
<select
ng-model="blisterPackTemplateSelected"
data-ng-options="blisterPackTemplate as blisterPackTemplate.name for blisterPackTemplate in blisterPackTemplates"
ng-change="changedValue(blisterPackTemplateSelected)">
<option value="">Select Account</option>
</select>
Немного сложно узнать ваш сценарий, не видя его, но это должно сработать.
Ответ 6
Вы можете сделать что-то вроде этого
<html ng-app="App" >
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>
<script>
angular.module("App",[])
.controller("ctrl",['$scope',function($scope){
$scope.changedValue = function(item){
alert(item);
}
}]);
</script>
<div >
<div ng-controller="ctrl">
<select ng-model="blisterPackTemplateSelected" ng-change="changedValue(blisterPackTemplateSelected)" >
<option value="">Select Account</option>
<option value="Add">Add</option>
</select>
</div>
</div>
</html>
вместо опции добавления вы должны использовать data-ng-options. Я использовал параметр Add для целей тестирования
Ответ 7
Я опоздал, но я решил такую же проблему таким простым и легким.
<select ng-model="blisterPackTemplateSelected" ng-change="selectedBlisterPack(blisterPackTemplateSelected)">
<option value="">Select Account</option>
<option ng-repeat="blisterPacks in blisterPackTemplates" value="{{blisterPacks.id}}">{{blisterPacks.name}}</option>
и функция для ng-изменения такова:
$scope.selectedBlisterPack= function (value) {
console.log($scope.blisterPackTemplateSelected);
};
Ответ 8
Вы получите выбранное значение параметра и текст из списка/массива с помощью фильтра.
editobj.FlagName = (EmployeeStatus | фильтр: {Значение: editobj.Flag}) [0].KeyName
<select name="statusSelect"
id="statusSelect"
class="form-control"
ng-model="editobj.Flag"
ng-options="option.Value as option.KeyName for option in EmployeeStatus"
ng-change="editobj.FlagName=(EmployeeStatus|filter:{Value:editobj.Flag})[0].KeyName">
</select>
Ответ 9
У меня была такая же проблема и я нашел уникальное решение. Это не лучшая практика, но она может оказаться простой/полезной для кого-то. Просто используйте jquery для идентификатора или класса или вашего тега select, а затем вы получите доступ к тексту и значению в функции изменения. В моем случае я передаю значения параметров через паруса /ejs:
<select id="projectSelector" class="form-control" ng-model="ticket.project.id" ng-change="projectChange(ticket)">
<% _.each(projects, function(project) { %>
<option value="<%= project.id %>"><%= project.title %></option>
<% }) %>
</select>
Затем в моем контроллере Angular моя функция изменения ng выглядит следующим образом:
$scope.projectChange = function($scope) {
$scope.project.title=$("#projectSelector option:selected").text();
};
Ответ 10
Я пробовал некоторые решения, но вот базовый производственный фрагмент. Пожалуйста, обратите внимание на вывод консоли при обеспечении качества этого фрагмента.
Отметить:
<!DOCTYPE html>
<html ng-app="appUp">
<head>
<title>
Angular Select snippet
</title>
<link rel="stylesheet" href="#" onclick="location.href='https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css'; return false;" />
</head>
<body ng-controller="upController">
<div class="container">
<div class="row">
<div class="col-md-4">
</div>
<div class="col-md-3">
<div class="form-group">
<select name="slct" id="slct" class="form-control" ng-model="selBrand" ng-change="Changer(selBrand)" ng-options="brand as brand.name for brand in stock">
<option value="">
Select Brand
</option>
</select>
</div>
<div class="form-group">
<input type="hidden" name="delimiter" value=":" ng-model="delimiter" />
<input type="hidden" name="currency" value="$" ng-model="currency" />
<span>
{{selBrand.name}}{{delimiter}}{{selBrand.price}}{{currency}}
</span>
</div>
</div>
<div class="col-md-4">
</div>
</div>
</div>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js">
</script>
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js"></script>
<script src="//maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js"></script>
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js">
</script>
<script src="js/ui-bootstrap-tpls-2.5.0.min.js"></script>
<script src="js/main.js"></script>
</body>
</html>
код:
var c = console;
var d = document;
var app = angular.module('appUp',[]).controller('upController',function($scope){
$scope.stock = [{
name:"Adidas",
price:420
},
{
name:"Nike",
price:327
},
{
name:"Clark",
price:725
}
];//data
$scope.Changer = function(){
if($scope.selBrand){
c.log("brand:"+$scope.selBrand.name+",price:"+$scope.selBrand.price);
$scope.currency = "$";
$scope.delimiter = ":";
}
else{
$scope.currency = "";
$scope.delimiter = "";
c.clear();
}
}; // onchange handler
});
Объяснение:
Важным моментом здесь является нулевая проверка измененного значения, то есть если значение равно 'undefined' или 'null', мы должны обработать эту ситуацию.