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

AngularJs和ASP.NET MVC 5-ng模型覆盖SELECT所选的OPTION

这里有一个指令应该对您的情况有所帮助:

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