web-dev-qa-db-ja.com

Angular HTML Selectオプションの無効化と有効化

HTMLの選択オプションがあります

<select>
    <option ng-repeat="field in filter.fields" value="{{field.id}}">{{field.name}}</option>
</select>

私はng-repeatから繰り返していますが、

<select>
    <option ng-repeat="field in filter.fields" {field.selectable==true?enable:disable} value="{{field.id}}">{{field.name}}</option>
 </select>

角度でこれを達成するにはどうすればよいですか?

19
Satish Sharma

次のような構造があると仮定します。

  $scope.filter = {
    fields: [
      {id: 1, name: "a", selectable: false},
      {id: 2, name: "asdf", selectable: true},
      {id: 3, name: "qwet", selectable: false},
      {id: 4, name: "qnjew", selectable: true},
      {id: 5, name: "asdjf", selectable: false}
    ]
  };

これはあなたのために働くはずです:

  <select>
    <option ng-repeat="field in filter.fields" ng-disabled="field.selectable" value="{{field.id}}">{{field.name}}</option>
  </select>
27
Kasper Lewau

Ng-disabled属性は技術的には機能しますが、オプションでng-repeatを使用するとバグが発生する可能性があります。これはよく知られた問題であり、angularチームがng-optionsを作成した理由です。ng-optionsを使用するためのangular実装はまだありませんとng-disabledは一緒ですが、Alec LaLondeは、追加して使用できるこのカスタムディレクティブを作成しました。 こちらの問題フォーラムを参照してください:https ://github.com/angular/angular.js/issues/638 および その投稿のjsfiddle

angular.module('myApp', [])
.directive('optionsDisabled', [ '$parse', function($parse) {
        var disableOptions = function($scope, attr, $element, data, fnDisableIfTrue) {
            $element.find('option:not([value="?"])').each(function(i, e) { //1
                var locals = {};
                locals[attr] = data[i];
                $(this).attr('disabled', fnDisableIfTrue($scope, locals));
            });
        };

        return {
            priority: 0,
            require: 'ngModel',
            link: function($scope, $element, attributes) { //2
                var expElements = attributes.optionsDisabled.match(/^\s*(.+)\s+for\s+(.+)\s+in\s+(.+)?\s*/),
                    attrToWatch = expElements[3],
                    fnDisableIfTrue = $parse(expElements[1]);
                $scope.$watch(attrToWatch, function(newValue, oldValue) {
                    if (!newValue) return;

                    disableOptions($scope, expElements[2], $element, newValue, fnDisableIfTrue);
                }, true);

                $scope.$watch(attributes.ngModel, function(newValue, oldValue) { //3
                    var disabledOptions = $parse(attrToWatch)($scope);
                    if (!newValue) return;

                    disableOptions($scope, expElements[2], $element, disabledOptions, fnDisableIfTrue);
                });
            }
        };
    }
]);
//1 refresh the disabled options in the select element
//2 parse expression and build array of disabled options
//3 handle model updates properly

function OptionsController($scope) {
    $scope.ports = [{name: 'http', isinuse: true},
                    {name: 'test', isinuse: false}];

    $scope.selectedport = 'test';
}
11
m59

これは実際にはかなり古い質問です。 Angular(angular 1.4+)の最新バージョンでは、ngOptionsディレクティブがあります。リンクは次のとおりです。

https://docs.angularjs.org/api/ng/directive/ngOptions

このケースを処理するための構文があります:

label disable when disable for value in array track by trackexpr

他の誰かがこのページにアクセスした場合に備えて、これを置くと思いました。

4
user1545858