我有两个指令,比如dir1,dir2。
dir1是一些常用指令。
我将dir2转换为dir1。
这是脚本:
<script>
var app = angular.module('myapp', []);
app.directive('dir1', function() {
return {
scope: {},
controller: D1Controller,
controllerAs: 'd1c',
transclude: true,
templateUrl: 'd1template'
}
function D1Controller() {
var vm = this;
vm.someValue = "some data";
}
});
app.directive('dir2', dir2);
function dir2() {
return {
tempalteUrl: 'dir2t',
scope: true,
bindToController: {},
controller: D2Controller,
controllerAs: 'mc',
link: link,
require: '^dir1'
}
}
D2Controller.$inject = ['$scope']; // <-- injecting something?
function D2Controller($scope) {
var vm = this;
var getDataListener = $scope.$watch('someValue', function fnGetData(someValue) {
if (!!someValue) {
vm.data = someValue;
getDataListener();
}
});
// $scope.$parent.$parent.someValue <-- this will work but seems not elegant way to do it.
}
function link(scope, iElement, iAddr, controller) {
scope.someValue = controller.someValue; // get data form parentDirective controller
}
</script>
<script type="text/ng-template" id="d1template">
<div>
...
<div ng-transclude></div>
...
</div>
</script>
我只能访问D1Controller表单dir2的链接函数(控制器)并通过作用域传递给D2Controller。
有没有办法(比如向D2Controller注入东西)从D2Controller访问D1Controller?
或者是否有其他方式在指令范围和转换范围之间进行通信?
感谢罗伯特的建议。
这是我的解决方案。
我发现一种优雅的方法是将D2Controller传递给D1Controller并让D1Controller设置数据。
我在D1Controller中添加了set data函数
vm.setData = function(controller) {
controller.data = vm.SOMEDATA;
}
在dir2的链接函数中,我调用d1controller.setData。
function link(scope, iElement, iAttr, controller) {
controller.setData(scope.mc);
}