AngularJs和ASP.NET MVC 5-ng模型覆盖SELECT所选的OPTION
本文关键字:SELECT OPTION 覆盖 模型 ASP NET MVC 5-ng AngularJs | 更新日期: 2023-09-27 18:21:08
继我之前的问题之后:
AngularJs和ASP.NET MVC 5-ng模型覆盖文本框值
我现在对SELECT也有同样的问题。
我有一个使用ASP.NET MVC 5构建的表单,使用@Html.EnumDropDownListFor
用我的模型填充表单(例如,在表单导航或服务器端验证失败后)。
我现在介绍了一个使用Angular(1.4.7)的客户端函数,这意味着SELECT现在用ng-model
进行装饰,以使Angular函数能够使用所选的值。
例如:
@Html.EnumDropDownListFor(m => m.MyEnum,
new { @class="form-control", ng_model="obj.myEnum" })
添加ng-model
现在会在重新加载页面时覆盖MVC模型中的选定选项集。
在浏览器中查看源代码显示所选选项是从MVC模型中正确设置的,但还有一个额外的选项正在被选择:
<select class="form-control ng-pristine ng-valid ng-touched"
name="MyEnum" ng-model="obj.myEnum">
<option value="? undefined:undefined ?"></option>
<option value="0">Please select</option>
<option selected="selected" value="1">Option1</option>
<option value="2">Option2</option>
</select>
如何防止这种情况发生,以便Option1
保持选中状态
使用上一个问题中的指令不起作用,因为SELECT没有value属性。
ng_init
也不适用于SELECT
这里有一个指令应该对您的情况有所帮助:
app.directive('initSelect', ['$parse', function($parse) {
return {
link: function(scope, element, attrs) {
var select = element[0];
if (!select.options.length || !attrs.ngModel) return;
var initialValue = select.options[select.selectedIndex].value;
$parse(attrs.ngModel).assign(scope, initialValue);
}
}
}]);
它将首先检索所选选项的值,在您的情况下为"1"。然后,它将使用$parse
服务来设置正确的ngModel值。
在此之后,选择应正确渲染。
演示:http://plnkr.co/edit/2VvkGfsPW94SPSVW6iUN?p=preview