require
Инструкция дает контроллер для директивы вы назвать в качестве четвертого аргумента вашей link
функции. (Вы можете использовать ^
для поиска контроллера в родительском элементе; ?
делает его необязательным.) Таким образом, require: 'ngModel'
вы получаете контроллер для ngModel
директивы, которым являетсяngModelController
.
Контроллеры директив могут быть написаны для предоставления API, которые могут использовать другие директивы; с помощью ngModelController
, вы получаете доступ к специальным встроенным функциям ngModel
, включая получение и установку значения. Рассмотрим следующий пример:
<input color-picker ng-model="project.color">
app.directive('colorPicker', function() {
return {
require: 'ngModel',
link: function(scope, element, attrs, ngModel) {
element.colorPicker({
pickerDefault: scope.color,
onColorChange: function(id, newValue) {
scope.$apply(function() {
ngModel.$setViewValue(newValue);
});
}
});
ngModel.$render = function() {
element.val(ngModel.$modelValue);
element.change();
};
}
}
});
Эта директива использует ngModel
контроллер для получения и установки значения цвета из палитры цветов. См. Этот пример JSFiddle: http://jsfiddle.net/BinaryMuse/AnMhx/
Если вы используете require: 'ngModel'
, вам, вероятно, также не следует использовать ngModel: '='
в своей изолированной области; ngModelController
дает вам все доступа вам необходимо изменить значение.
Нижний пример на домашней странице AngularJS также использует эту функциональность (за исключением использования настраиваемого контроллера ngModel
).
Что касается корпуса директивы, например ngModel
vs ng-model
vs data-ng-model
: в то время как Angular поддерживает использование нескольких форм в DOM, когда вы ссылаетесь на директиву по имени (например, при создании директивы или использовании require
), вы всегда используете lowerCamelCase форма имени.
ng-model='property'