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>
角度でこれを達成するにはどうすればよいですか?
次のような構造があると仮定します。
$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>
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';
}
これは実際にはかなり古い質問です。 Angular(angular 1.4+)の最新バージョンでは、ngOptionsディレクティブがあります。リンクは次のとおりです。
https://docs.angularjs.org/api/ng/directive/ngOptions
このケースを処理するための構文があります:
label disable when disable for value in array track by trackexpr
他の誰かがこのページにアクセスした場合に備えて、これを置くと思いました。