【问题标题】:ng-options duplicating option in selectng-options 在选择中复制选项
【发布时间】:2018-02-20 12:48:32
【问题描述】:

我使用 ng-options 选择与列表绑定的元素。我有一个自定义指令,它将验证指令添加到选择元素。此自定义指令编译 select 元素。编译选择元素后,选项被复制。有没有办法在至少编译之前停止重复或清除它们?

在下面的代码中,元数据是一个自定义指令。在该指令中,我有 compile($el)($scope) 行。执行完这一行后,select变成如下图

请选择性别



女性

function ($scope, $el, $attr, $ngModel) {

    if (!$ngModel) {
        return;
    }

    var elementMetadata = JSON.parse($attr.metadata);

    angular.forEach(elementMetadata.validators,
        function (item) {
            $el.attr(item.name, item.value);
        });

    $el.removeAttr('metadata');
    $compile($el)($scope);
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<select name="gender" id="lstGender" ng-options="gender for gender in genderList track by gender" ng-model="fields.gender" metadata="{{template.gender}}">
   <option value="">Please select gender</option>
</select>

【问题讨论】:

  • 您的代码演示没有准确描述您面临的问题。您能否提供更多关于您所面临问题的具体部分的详细信息?

标签: javascript angularjs


【解决方案1】:

使用post将编译选择元素移动到编译执行的最后一个函数

          pre: function(scope, element) {
            scope.values =  [ 'male', 'female' ];
          },
          post: function() {
            $compile(tElement)(scope);
          }

codepen-https://codepen.io/nagasai/pen/MQQLbB

【讨论】:

  • 这看起来是个不错的选择。但我无法对 scope.values 进行硬编码。上面的代码只是一个例子。我有几个这样的选择元素,并且该指令是通用的。有没有办法通用地设置选项?
  • 我的意思是说有没有办法,我可以在 pre.select 中访问当前选项。否则,我必须想出一种半硬编码的方式从控制器中获取它。