Редагування 2: Я залишу свою відповідь, оскільки це може бути корисно з інших причин, але інша відповідь від Марка Райкока - це те, що я спочатку хотів зробити, але не зміг приступити до роботи. Очевидно, батьківський контролер тут буде form
, ні ngForm
.
Ви можете передати його, використовуючи атрибут у своїй директиві, хоча це буде досить багатослівно.
Приклад
Ось робочий спрощений jsFiddle .
Код
HTML:
<div ng-form="myForm">
<my-input form="myForm"></my-input>
</div>
Основні частини директиви:
app.directive('myInput', function() {
return {
scope: {
form: '='
},
link: function(scope, element, attrs) {
console.log(scope.form);
}
};
});
Що відбувається
Ми попросили Angular прив'язати значення області, названу в form
атрибуті, до нашої ізольованої області, використовуючи '='
.
Робить це таким чином, відокремлює фактичну форму від директиви введення.
Примітка: Я намагався використовувати require: "^ngForm"
, але директива ngForm не визначає контролер і не може бути використана таким чином (що дуже погано).
З усього сказаного, я думаю, що це дуже багатослівний і брудний спосіб вирішити це. Можливо, вам було б краще додати нову директиву до елемента форми та використовувати require
для доступу до цього елемента. Я подивлюсь, чи зможу я щось скласти.
Змінити: Використання батьківської директиви
Добре, ось найкраще, що я міг зрозуміти, використовуючи батьківську директиву, я поясню більше через секунду:
Робота jsFiddle з використанням батьківської директиви
HTML:
<div ng-app="myApp">
<div ng-form="theForm">
<my-form form="theForm">
<my-input></my-input>
</my-form>
</div>
</div>
JS (частково):
app.directive('myForm', function() {
return {
restrict: 'E',
scope: {
form: '='
},
controller: ['$scope', function($scope) {
this.getForm = function() {
return $scope.form;
}
}]
}
});
app.directive('myInput', function() {
return {
require: '^myForm',
link: function(scope, element, attrs, myForm) {
console.log(myForm.getForm());
}
};
});
Це зберігає форму в області батьківської директиви ( myForm
) і дозволяє дочірнім директивам отримувати до неї доступ, вимагаючи батьківську форму ( require: '^myForm'
) та отримуючи доступ до контролера директиви у функції зв’язку (myForm.getForm()
).
Переваги:
- Потрібно лише визначити форму в одному місці
- Ви можете використовувати батьківський контролер для розміщення загального коду
Негативні:
- Вам потрібен додатковий вузол
- Потрібно двічі вказати назву форми
Що я б віддав перевагу
Я намагався змусити його працювати, використовуючи атрибут елемента форми . Якщо це спрацювало, вам потрібно було б лише додати директиву до того самого елемента, що іngForm
.
Однак я отримував якусь дивну поведінку із сферою дії, де myFormName
змінна буде видно всередині $scope
, але це буде undefined
тоді, коли я спробую отримати до неї доступ. Цей мене розгубив.