我的.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()
结果,我在select标签
上尝试了另一种方法:ng_change = 'changedValue()'
和
功能:
$scope.changedValue = function() {
console.log($scope.blisterPackTemplateSelected);
}
但blisterPackTemplateSelected
存储在子范围内。我读到父母无法访问子范围。
当下拉列表中的选定值发生变化时,执行某些操作的正确/最佳方法是什么?如果是方法1,我的代码出错了什么?
答案 0 :(得分:183)
因为Artyom说您需要使用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);
}
}
答案 1 :(得分:32)
我可能会迟到但我有点有点同样的问题。
我需要将id和name都传递给我的模型,但是所有正统的解决方案让我在控制器上创建代码来处理更改。
我使用过滤器远离它。
<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>
&#34;技巧&#34;在这里:
ng-change="selected_name=(options|filter:{id:selected_id})[0].name"
我使用内置过滤器来检索id的正确名称
这是一个带有工作演示的plunkr。
答案 2 :(得分:19)
请使用ngChange
指令。
例如:
<select ng-model="blisterPackTemplateSelected"
ng-options="blisterPackTemplate as blisterPackTemplate.name for blisterPackTemplate in blisterPackTemplates"
ng-change="changeValue(blisterPackTemplateSelected)"/>
并将控制器中的新模型值作为参数传递:
ng-change="changeValue(blisterPackTemplateSelected)"
答案 3 :(得分:8)
最佳做法是创建一个对象(总是在ng-model中使用。)
在您的控制器中:
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视频"The Dot"有一个很好的概述,这个非常流行的堆栈溢出问题也是如此:What are the nuances of scope prototypal / prototypical inheritance in AngularJS?
答案 4 :(得分:5)
您可以通过ng-change功能将ng-model值作为参数传递:
<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>
在没有看到它的情况下知道你的场景有点困难,但这应该有效。
答案 5 :(得分:2)
你可以做这样的事情
<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选项进行测试
答案 6 :(得分:2)
我迟到了,但我以这种简单易行的方式解决了同样的问题。
<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-change的功能如下;
$scope.selectedBlisterPack= function (value) {
console.log($scope.blisterPackTemplateSelected);
};
答案 7 :(得分:1)
您将使用过滤器从列表/数组中获取选定选项的值和文本。
editobj.FlagName =(EmployeeStatus | filter:{Value: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>
答案 8 :(得分:0)
我遇到了同样的问题并找到了一个独特的解决方案。这不是最佳做法,但它可能对某人来说简单/有用。只需在id或类或select标签上使用jquery,然后您就可以访问更改功能中的文本和值。在我的情况下,我通过sails / 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-change函数如下所示:
$scope.projectChange = function($scope) {
$scope.project.title=$("#projectSelector option:selected").text();
};
答案 9 :(得分:0)
我尝试了一些解决方案,但这里是基本的生产片段。请在此片段的质量保证期间注意控制台输出。
Mark Up:
<!DOCTYPE html>
<html ng-app="appUp">
<head>
<title>
Angular Select snippet
</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" />
</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',我们应该处理这种情况。