Я создаю огромную форму, которая вызывает различные директивы для создания полной формы. Главная страница, вызывающая Form Builder, передает данные ng-модели следующим образом:
<div form-builder form-data=“formData”></div>
Затем страница Form Builder вызывает различные дочерние директивы для создания различных разделов формы:
FormBuilder.html:
<div form-fields></div>
<div photo-fields></div>
<div video-fields></div>
.. etc.. etc...
При использовании $scope
в контроллере у меня не было проблем с доступом к $scope
в дочерних директивах следующим образом:
function formBuilder() {
return {
restrict: 'A',
replace: true,
scope: {
formData: '='
},
templateUrl: 'FormBuilder.html',
controller: function($scope) {
$scope.formSubmit = function() {
// Submits the formData.formFields and formData.photoFields
// to the server
// The data for these objects are created through
// the child directives below
}
}
}
}
function formFields() {
return {
restrict: 'A',
replace: true,
templateUrl: 'FormFields.html',
controller: function($scope) {
console.log($scope.formData.formFields);
}
}
}
function photoFields() {
return {
restrict: 'A',
replace: true,
templateUrl: 'PhotoFields.html',
controller: function($scope) {
console.log($scope.formData.photoFields);
}
}
}
... etc..
Но с тех пор, как я избавился от $scope
и начал использовать ControllerAs
, у меня возникают всевозможные проблемы с доступом к двухсторонней привязке с родительско-дочерними контроллерами.
function formBuilder() {
return {
restrict: 'A',
replace: true,
scope: {
formData: '='
},
templateUrl: 'FormBuilder.html',
controller: function() {
var vm = this;
console.log(vm.formData); // Its fine here
vm.formSubmit = function() {
// I cannot change formData.formFields and formData.photoFields
// from Child Directive "Controllers"
}
},
controllerAs: ‘fb’,
bindToController: true
}
}
function formFields() {
return {
restrict: 'A',
replace: true,
templateUrl: 'FormFields.html',
controller: function() {
var vm = this;
console.log(vm.formData.formFields);
// No way to access 2 way binding with this Object!!!
}
}
}
function photoFields() {
return {
restrict: 'A',
replace: true,
templateUrl: 'PhotoFields.html',
controller: function() {
var vm = this;
console.log(vm.formData.photoFields);
// No way to access 2 way binding with this Object!!!
}
}
}
Что бы я ни пытался, я достигаю дорожного блока. Вещи, которые я пробовал:
- Изолированные области: я попытался передать
formData.formFields
иformData.photoFields
в качестве изолированных областей в дочернюю директиву, но в итоге получил ошибку$compile: MultiDir
из-за вложенных изолированных областей, поэтому это невозможно. - Если у меня нет отдельных директив для каждого раздела формы, а все они находятся в одной директиве под директивой
formBuilder
, то это становится огромной директивой. Вышеприведенный пример — это всего лишь набросок, но каждая дочерняя директива в конце строит одну большую форму. Так что слияние их вместе — действительно последнее средство, так как оно становится сложным в обслуживании и нечитаемым. - Я не думаю, что есть способ получить доступ к родительской директиве
ControllerAs
из дочерней директивыController
любым другим способом из того, что я видел до сих пор. - Если я использую родительский ControllerAs в ng-модели шаблона дочерней директивы, такой как
<input type=“text” ng-model=“fb.formData.formFields.text" />
, это работает нормально, но мне нужно получить доступ к тому же самому из контроллера дочерней директивы для некоторой обработки, которую я не могу сделать. - Если я избавлюсь от
controllerAs
и снова использую$scope
, он будет работать как раньше, но я пытаюсь полностью избавиться от$scope
, чтобы подготовиться к будущим изменениям Angular.
Поскольку это расширенная форма, мне нужно иметь отдельную директиву для обработки различных разделов формы, а поскольку вложенные изолированные области не разрешены, начиная с Angular 1.2, это усложняет задачу, особенно при попытке избавиться от $scope
с помощью ControllerAs
.
Может ли кто-нибудь помочь мне, какие у меня есть варианты, пожалуйста? Я благодарю вас за чтение моего длинного поста.