2015-04-06 4 views
2

Я пытаюсь создать простую директиву show/hide на основе элементов, переведенных в div. У меня есть родительская и дочерняя директива. При нажатии на родительскую директиву директива child должна переключать отображение/скрытие своего div. Функция переключения находится в родительском контроллере и переключает переменную между true и false, чтобы дочерняя директива отображала/скрывала.связать директиву директивы parent с дочерней директивой в угловом

Проблема: функция переключения в родительской директиве работает правильно, однако дочерняя директива не знает изменения переменной переключения при щелчке родителя. Я передаю ctrl функции ссылки в дочерней директиве, используя require. Таким образом я могу получить доступ к родительским объектам контроллера для показа и скрытия. Переключающая переменная отображается дочерним элементом, но не отражает никаких изменений после начальной загрузки страницы. При нажатии ничего не отображается или не скрывается.

код:

angular.module('demo', []) 

.directive('demoParent', function() { 
    return { 
     restrict: 'E', 
     scope: {}, 
     transclude: true, 
     template: '<div ng-click="toggleTarget()" ng-transclude></div>', 
     controller: function($scope) { 
      $scope.toggleTarget = function() { 
       this.openTarget = !this.openTarget; 
      }; 
      this.openTarget = false; 
     } 
    }; 
}) 

.directive('demoChild', function() { 
    return { 
     require: '^demoParent', 
     restrict: 'E', 
     transclude: true, 
     link: function(scope, elem, attrs, ctrl) { 
      scope.ctrl = ctrl; 
     }, 
     template: '<div ng-show="ctrl.openTarget" ng-transclude></div>', 
    }; 
}); 

нужен ли ребенку, чтобы добавить Бодрствующий к родительскому Ctrl или это случай изолированных переменным, как только передается от родителей к ребенку?

+2

'demoChild' требует, контроллер demoChild. Если вам нужно получить доступ к объему 'demoParent' из' demoChild', вам нужно будет потребовать его вместо 'require: '^ demoParent''. –

+0

Не могли бы вы показать свой HTML-код? –

+1

Просто изменил его на demoParent, это была опечатка на моем конце. Я не получаю никаких ошибок при требовании родительского контроллера. Кажется, что ребенок просто не знает никаких изменений в родительском контроллере. – user3613538

ответ

1

Я сделал Fiddle с вашим рабочим сценарием, вы имели проблемы с this функциональности, а также, за исключением ^demoChild, который вы сказали, была опечаткой. После того, как внутри функции, то this указывал на объем, а не контроллер, как вы ожидали, поэтому этот раздел должен быть изменен:

controller: function($scope) { 
    this.openTarget = false; 
    var _ctrl = this; 
    $scope.toggleTarget = function() { 
     _ctrl.openTarget = !_ctrl.openTarget;    
    };    
} 
+0

Это сработало для меня. Как получилось, что присвоение этого другому var устраняет проблему? Используя это косвенно против прямого и передавая его ребенку. – user3613538

+0

@ user3613538 'var _ctrl = this;' эта строка должна содержать ссылку на ваш контроллер, который вы затем используете в функции. В противном случае 'this' указывает на' $ scope', так как значение 'this' меняется - в зависимости от того, как вы вызываете функцию. –

+0

Спасибо! Очень полезно – user3613538

0

попробуйте следующее: var me = this; $ scope.toggleTarget = function() { me.openTarget =! Me.openTarget; };