Angular Выбор HTML-опции отключить и включить
У меня есть опция выбора 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>
Как я могу достичь этого с помощью angular?
Ответы
Ответ 1
Предполагая, что у вас есть такая структура:
$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>
Ответ 2
В то время как атрибут ng-disabled будет технически работать, вы, вероятно, столкнетесь с ошибками при использовании опций ng-repeat. Это хорошо известная проблема, и именно поэтому команда angular создала ng-options. Еще нет реализации angular для использования ng-options и 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';
}
Ответ 3
На самом деле это довольно старый вопрос. В более поздней версии Angular (angular 1.4+) у вас есть директива ngOptions. Вот ссылка: -
https://docs.angularjs.org/api/ng/directive/ngOptions
В настоящее время существует синтаксис для обработки этого случая: -
label disable when disable for value in array track by trackexpr
Мне показалось, что я бы поставил это на случай, если кто-то еще посетит эту страницу.