Это HTML-код моей директивы:
<textarea data-modal="modal" data-mydir ng:model="abc"></textarea>
В моей директиве есть это:
return {
require: 'ngModel',
replace: true,
scope: {
modal: '=modal',
ngModel: '=',
pid: '=pid'
},
Может кто-нибудь сказать мне, какое значение имеет require: 'ngModel'? Я вижу это во многих разных директивах. Могу я назвать это модальным для данных?
Я смущен, потому что когда я меняю его на модальный, я получаю сообщение от Angular, говорящее
Controller 'ngModel', required by directive 'textarea', can't be found!
ng-model='property'
Ответы:
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({ // initialize the color to the color on the scope pickerDefault: scope.color, // update the ngModel whenever we pick a new color onColorChange: function(id, newValue) { scope.$apply(function() { ngModel.$setViewValue(newValue); }); } }); // update the color picker whenever the value on the scope changes ngModel.$render = function() { element.val(ngModel.$modelValue); element.change(); }; } } });
Эта директива использует
ngModel
контроллер для получения и установки значения цвета из палитры цветов. См. Этот пример JSFiddle: http://jsfiddle.net/BinaryMuse/AnMhx/Если вы используете
require: 'ngModel'
, вам, вероятно, также не следует использоватьngModel: '='
в своей изолированной области;ngModelController
дает вам все доступа вам необходимо изменить значение.Нижний пример на домашней странице AngularJS также использует эту функциональность (за исключением использования настраиваемого контроллера
ngModel
).Что касается корпуса директивы, например
ngModel
vsng-model
vsdata-ng-model
: в то время как Angular поддерживает использование нескольких форм в DOM, когда вы ссылаетесь на директиву по имени (например, при создании директивы или использованииrequire
), вы всегда используете lowerCamelCase форма имени.источник
require: 'ngModel'
следует использоватьngModel: '='
?Как указано в документации по созданию пользовательских директив : (во-первых, на ваш вопрос в комментарии)
Ответ:
Примеры:
Во-вторых, что собой
?ngModel
представляет?// Always use along with an ng-model require: '?ngModel',
При использовании вашей директивы он заставляет использовать ее вместе с атрибутом / контроллером
ng-model
.require
установка(Отрывок из книги AngularJS Брэда Грина и Шьяма Сешадри)
источник
Они
require:'ngModel'
иrequire:'^ngModel'
позволяют вам внедрить модель, прикрепленную к элементу или его родительскому элементу, к которому привязана директива.По сути, это самый простой способ передать ngModel в функцию ссылки / компиляции вместо того, чтобы передавать его с помощью параметра области. Получив доступ к ngModel, вы можете изменить его значение с помощью
$setViewValue
, сделать его грязным / чистым с помощью$formatters
, применить наблюдателей и т. Д.Ниже приведен простой пример передачи ngModel и изменения его значения через 5 секунд.
Демо: http://jsfiddle.net/t2GAS/2/
myApp.directive('myDirective', function($timeout) { return { restrict: 'EA', require: 'ngModel', link: function(scope, element, attrs, ngModel) { ngModel.$render = function() { $timeout(function() { ngModel.$setViewValue('StackOverflow'); }, 5000); }; } }; });
источник