Я объясню, что именно я пытаюсь сделать, прежде чем объяснять проблему. У меня есть Директива, которая содержит форму, и мне нужно получить доступ к этой форме из родительского элемента (где используется Директива) при нажатии кнопки отправки, чтобы проверить, что форма действительна.
Для этого я пытаюсь использовать $scope.$parent[$attrs.directiveName] = this;
, а затем привязывая некоторые методы к Директиве, такие как this.isValid
, которые будут отображаться и исполняться в родительском.
Это нормально работает при запуске локально, но когда вы меняете и создаете мой код (Yeoman angular-fullstack), я получаю сообщение об ошибке aProvider
, о котором я проследил до ошибки $scopeProvider
в контроллере.
У меня были аналогичные проблемы в прошлом, и моя первая мысль заключалась в том, что мне нужно конкретно указать $inject
для $scope
, чтобы имя не было потеряно. Но увы ..... не повезло.
Является ли что-то очевидным, что я делаю неправильно?
Любая помощь приветствуется.
(function() {
'use strict';
angular
.module('myApp')
.directive('formDirective', formDirective);
function formDirective() {
var directive = {
templateUrl: 'path/to/template.html',
restrict: 'EA',
scope: {
user: '='
},
controller: controller
};
return directive;
controller.$inject = ['$scope', '$attrs', 'myService'];
function controller($scope, $attrs, myService) {
$scope.myService = myService;
// Exposes the Directive Controller on the parent Scope with name Directive's name
$scope.$parent[$attrs.directiveName] = this;
this.isValid = function() {
return $scope.myForm.$valid;
};
this.setDirty = function() {
Object.keys($scope.myForm).forEach(function(key) {
if (!key.match(/\$/)) {
$scope.myForm[key].$setDirty();
$scope.myForm[key].$setTouched();
}
});
$scope.myForm.$setDirty();
};
}
}
})();
Я бы посмотрел на переход от директивы к компоненту https://docs.angularjs.org/guide/component. Затем используйте идею входов и выходов для связи с родительским контейнером и компонентом. То, что вы делаете, - это не правильный способ сделать это. – Stevo
Jeez, не понимал, что '.component' был добавлен в Angular 1.x. Некоторая помощь в преобразовании этой существующей логики в компонент была бы весьма признательна. – germainelol