2015-11-17 7 views
2

Я не могу получить доступ к контроллеру родительской директивы только из одного вложенного. Однако доступ к родительскому контроллеру работает, когда ngIf используется вместе с вложенной директивой. Я хотел бы знать, какие изменения вносятся ngIf, чтобы иметь возможность получить доступ к родительскому контроллеру без него.пытается получить доступ к родительскому контроллеру той же директивы

Директива выглядит следующим образом:

angular.module("myApp", []) 
.directive("some", function() { 
    return { 
    restrict: 'A', 
    require: ['?^some', '?^^some'], 
    link: function(scope, element, attrs, parentCtrls) { 
     attrs.$observe("some", function(someValue) { 
     scope.someName = someValue; 
     scope.parentCtrls = parentCtrls 
     console.log(someValue + " ctrls: " + parentCtrls); 
     }); 
    }, 
    controller: function($scope) { 
     this.toString = function() { return $scope.someName } 
    } 
    } 
}); 

и код, где вложенные элементы могут быть произвольной глубины:

<html ng-app="myApp"> 
    <head><!-- proper init here --></head> 

    <body> 
    <div some="outer"> 
     outer parent ctrls: {{parentCtrls.toString()}} 
     <div> 
     <div some="nested1">nested1 parent ctrls: {{parentCtrls.toString()}}</div> 
     <div some="nested2" ng-if="true">nested2 parent ctrls: {{parentCtrls.toString()}}</div> 
     </div> 
    </div> 
    </body> 
</html> 

Эффект, который ?^somoe всегда решает самостоятельно контроллер (который объясняется, например, here) и ?^^some разрешает родительский контроллер только для nested2. Его можно проверить на plunker (проверено на угловых 1.3.15 и 1.4.7). ПРИМЕЧАНИЕ: приведенный выше пример на самом деле неверен (в ближайшее время я попытаюсь обновить пример) из-за того, что область разделяется outer и nested1. Тем не менее проблема существует в более сложном случае, и принятый ответ правильно перехватил ее.

EDIT

Принято ответ был достаточно для меня, чтобы выяснить нужный путь. Угловой ищет контроллер родительской директивы, вызывая element.parent().inheritedData('$' + name + 'Controller'). Поэтому вместо ?^^some я могу использовать element.parent().inheritedData('$someController') для доступа к требуемому родительскому контроллеру.

ответ

1

Если угловой должен составить HTML с вложенными директивами он делает это в три этапа:

  1. компилировать от внешнего к внутреннему директивы
  2. предварительно связь от наружной к внутренней директиве
  3. post-link (thats your link phase) от внутренней директивы к внешней.

В фазе пост-ссылки области действия привязаны к директивам. Это означает, что «вложенные1» и «вложенные2» ​​привязаны к их областям, прежде чем «внешний» привязан к своей области.

Если вы используете ng-if, это имеет завершающий эффект при компиляции этого поддерева и привязка области действия задерживается до тех пор, пока выражение не будет проверено как правдивое в следующем цикле компиляции. В этом случае «insested2» привязан к своей области после того, как «внешний» был связан.

+0

Это коротко и точно. Хотя на самом деле мне было интересно, как можно получить доступ к родительскому контроллеру в любом случае, ваш ответ помог мне быстро найти желаемое решение. Благодаря! – ciekawy

Смежные вопросы