Angularjs指令控制器服务交互

Angularjs指令控制器服务交互,angularjs,angularjs-directive,angularjs-scope,Angularjs,Angularjs Directive,Angularjs Scope,标题有点言过其实,但我的现状是: 我有一个指令(D1),它是我在根目录中的模式弹出窗口的普通标记。 我有一个指令(D2),它在控制器的作用域(C1)中。我想让D2在模式D1中设置内容。我有一个注入C1的服务(S1),它从网络中提取数据,我希望最终注入D1 D1如下(模式的普通标记): 在C1中的S1将数据返回给D2以填充D1之后,D1如下所示。D2将负责定义D1中的模型数据,例如{{title}。 其思想是拥有一个可通过另一个指令(D2)定义/填充的通用、解耦模式(D1) 我很难实现这个功能

标题有点言过其实,但我的现状是:

我有一个指令(D1),它是我在根目录中的模式弹出窗口的普通标记。 我有一个指令(D2),它在控制器的作用域(C1)中。我想让D2在模式D1中设置内容。我有一个注入C1的服务(S1),它从网络中提取数据,我希望最终注入D1

D1如下(模式的普通标记):

在C1中的S1将数据返回给D2以填充D1之后,D1如下所示。D2将负责定义D1中的模型数据,例如{{title}。

其思想是拥有一个可通过另一个指令(D2)定义/填充的通用、解耦模式(D1)

我很难实现这个功能。还有一点,我希望D1有一个API,我可以调用它来用不同的元素填充模式,比如复选框、输入、文本。这将不同于仅在D1之外构建标记,然后将其完全注入D1

基本代码包括:

myApp.controller('C1', function(S1){
   var results = S1.query();
   // populate D1 attributes with results from S1?  or a getter function in the controller to returns results to D1.
}

myApp.directive('D1', function() {
var createCheckBox = function( name ){ // one of many different element available exposed through D1's API.
    var checkbox = document.createElement('input');
    checkbox.type = 'checkbox';
    checkbox.name = name;
    return checkbox;
}
return{
   restrict: "E",
   templateUrl: '/path/to/my/modal.html',
   controller: function( $scope ){ // hopefully this would be D1's API
       $scope.modalContent = [];
       this.addCheckBox = function( checkboxName ){
           $scope.push( this.createCheckBox( checkboxName ) );
       }
   }
   link: function( scope, element, attrs ){
        // set up events on the modal (such as closing it)
   }
}
} // end of D1

myApp.directive('D2', function() {
    return{
       restrict: "A",
       require: 'D1', // <-- do not think this is possible with my setup.
       link: function( scope, element, attrs ){
            element.bind( 'click', function(){
                // loop through data returned by service
                D1.addCheckBox(/* checkbox's name */ );
                // end loop
            });

       }
    } 
}// end of D2
myApp.controller('C1',函数(S1){
var results=S1.query();
//使用S1?的结果填充D1属性,或在控制器中使用getter函数将结果返回给D1。
}
myApp.directive('D1',function(){
var createCheckBox=function(name){//通过D1的API公开的许多不同元素之一。
var checkbox=document.createElement('input');
checkbox.type='checkbox';
checkbox.name=名称;
返回复选框;
}
返回{
限制:“E”,
templateUrl:“/path/to/my/modal.html”,
控制器:函数($scope){//希望这是D1的API
$scope.modalContent=[];
this.addCheckBox=函数(checkboxName){
$scope.push(this.createCheckBox(checkboxName));
}
}
链接:函数(范围、元素、属性){
//在模式上设置事件(例如关闭它)
}
}
}//D1结束
myApp.directive('D2',function(){
返回{
限制:“A”,
要求:'D1',/哇长的问题!我不确定我是否完全理解,但跟随Jonnybajandles的评论

你能不能
$broadcast
$on

$rootScope.$broadcast('MyEvent'); // Fire an event

$scope.$on('MyEvent', function () {  });  // Handle the event

或者简单地使用
$rootScope

如果D1负责所有渲染,那么D2是否需要成为一个指令?它不能是一个控制器吗?我相信D1只是一个模式,可以出现在任何页面标记之外或之外。我想问题是D2如何与D1通信?下面是我对类似问题的回答:。
$rootScope.$broadcast('MyEvent'); // Fire an event

$scope.$on('MyEvent', function () {  });  // Handle the event