Подтвердить что ты не робот

AngularJS: Access formController формы, помещенной внутри transcluded директивы от родительского контроллера

Я создал простую директиву "модальный диалог", в которой используется transclude. Я хотел бы разместить форму() внутри директивы "модальный диалог". Я бы ожидал, что formController формы, помещенной внутри директивы, будет доступен в области родительского контроллера, но это не так. Взгляните на следующую скрипку: http://jsfiddle.net/milmly/f2WMT/1/

Полный код:

<!DOCTYPE html>
<html>
    <head>
        <title>AngJS test</title>
        <link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/foundation/4.0.9/css/foundation.min.css">
        <style>
            .reveal-modal {
                display: block;
                visibility: visible;
            }
        </style>
        <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/angularjs/1.1.4/angular.min.js"></script>
        <script type="text/javascript">
            var app = angular.module('app', []);
            app.controller('appCtrl', function ($scope) {
                $scope.model = {
                    id: 1, name: 'John'
                };
                $scope.modal = {
                    show: false
                };
           });
           app.directive('modal', function () {
               return {
                   scope: {
                       show: '='
                   },
                   transclude: true,
                   replace: true,
                   template: '<div class="reveal-modal small" ng-show="show"><div class="panel" ng-transclude></div></div>'
               }
           });
       </script>
    </head>
    <body ng-app="app">
        <div ng-controller="appCtrl">
            <div class="panel">
                Id: {{ model.id }}<br>
                Name: {{ model.name }}<br>
                Controller formController: {{ form }}<br>
                Directive formController: {{ myForm }}<br>
            </div>

            <form name="form" class="panel">
                <input type="text" ng-model="model.name">
            </form>

            <a ng-click="modal.show=!modal.show">toggle dialog</a>

            <div modal show="modal.show">
                <form name="myForm">
                    <input type="text" ng-model="model.name">
                </form>
            </div>

        </div>
    </body>
</html>

Итак, мой вопрос заключается в том, как получить доступ или можно получить доступ к директиве formController от родительского контроллера?

Спасибо за ответы.

-Milan

4b9b3361

Ответ 1

Поскольку вы используете transclude, директива создаст дочернюю трансграничную область. Не существует простого пути от области контроллера (003) до директивы, ограниченной границей (005):

enter image description here

(Жесткий/не рекомендуемый путь - через частное свойство $$childHead в области контроллера, найдите область изоляции, затем используйте $$nextSibling, чтобы перейти в область с перекрестным доступом.)


Update: Из соображений этого ответа я думаю, что мы можем получить formController внутри директивы, а затем использовать =, чтобы передать его родительскому.

scope: { show: '=', formCtrl: '=' },
...
link: function(scope, element) {
   var input1 = element.find('input').eq(0);
   scope.formCtrl = input1.controller('form');
}

HTML:

<div modal show="modal.show" form-ctrl="formCtrl">

Fiddle

enter image description here

Ответ 2

Вот мое решение: Я создаю такой метод в родительском контроллере:

$scope.saveForm = function(form) {
  $scope.myForm = form;
};

Затем я называю это в закрытом контенте:

<my-directive>
  <form name="myForm">
     <div ng-init="saveForm(myForm)"></div>
  </form>
</my-directive>

После создания экземпляра директивы у меня есть экземпляр контроллера формы в родительской области.