我不确定这是这样做的方法,但是我的目标是:
当然,问题在于父和子指令是同级的。所以我不知道该怎么做。注意-我不想在
小提琴:http : //jsfiddle.net/rrosen326/CZWS4/
的HTML:
<div ng-controller="parentController"> <parent-dir dir-data="display this data"> <child-dir></child-dir> </parent-dir> </div>
Java脚本
var testapp = angular.module('testapp', []); testapp.controller('parentController', ['$scope', '$window', function ($scope, $window) { console.log('parentController scope id = ', $scope.$id); $scope.ctrl_data = "irrelevant ctrl data"; }]); testapp.directive('parentDir', function factory() { return { restrict: 'ECA', scope: { ctrl_data: '@' }, template: '<div><b>parentDir scope.dirData:</b> {{dirData}} <div class="offset1" ng-transclude></div> </div>', replace: false, transclude: true, link: function (scope, element, attrs) { scope.dirData = attrs.dirData; console.log("parent_dir scope: ", scope.$id); } }; }); testapp.directive('childDir', function factory() { return { restrict: 'ECA', template: '<h4>Begin child directive</h4><input type="text" ng-model="dirData" /></br><div><b>childDir scope.dirData:</b> {{dirData}}</div>', replace: false, transclude: false, link: function (scope, element, attrs) { console.log("child_dir scope: ", scope.$id); scope.dirData = "No, THIS data!"; // default text } }; });
如果要进行这种通信,则需要require在child指令中使用。这将需要父级,controller因此您需要一个controller具有希望子级指令使用的功能的父级。
require
controller
例如:
app.directive('parent', function() { return { restrict: 'E', transclude: true, template: '<div>{{message}}<span ng-transclude></span></div>', controller: function($scope) { $scope.message = "Original parent message" this.setMessage = function(message) { $scope.message = message; } } } });
控制器中有一条消息$scope,您可以更改它。
$scope
为什么$scope一对一使用this?您无法访问$scopechild指令中的in,因此您需要this在函数中使用,以便您的child指令能够对其进行调用。
this
app.directive('child', function($timeout) { return { restrict: 'E', require: '^parent', link: function(scope, elem, attrs, parentCtrl) { $timeout(function() { parentCtrl.setMessage('I am the child!') }, 3000) } } })
如您所见,该链接使用parentCtrl接收第四个参数(或者如果有多个数组,则为数组)。在这里,我们只等待3秒钟,直到调用在父控制器中定义的方法以更改其消息。
在此处实时查看:http : //plnkr.co/edit/72PjQSOlckGyUQnH7zOA?p=preview