2016-09-07 53 views
0

我试图写一个指令,获取父控制器和父窗体控制器,并将它们传递作为单个对象,以我的控制器,这是我有:通OBJ从指令在AngularJS到控制器

HTML :

<div ng-controller="ParentController as self" ng-form="ParentForm"> 

    <div ng-controller="ChildController1 as self" my-parent="self.parent"> 
    ChildController1 parent:<br/> 
    {{self.parent}} 
    </div> 

    <br/> 

    <div ng-controller="ChildController2 as self" my-parent="self.parent"> 
    ChildController2 parent:<br/> 
    {{self.parent}} 
    </div> 

</div> 

JS:

myApp.directive('myParent', function() { 
    var directive = { 
    restrict: 'A', 
    link: link 
    }; 

    return directive; 

    function link(scope, element, attrs) { 
    var parentElement = element.parent(); 
    var parentCtrl = parentElement.controller(); 
    var formCtrl = parentElement.controller('form'); 

    var parent = parentCtrl; 
    parent.form = formCtrl; 

    console.log("directive parent obj: ", parent); 

    // How can I pass the parent obj to controller??? 
    } 
}); 

我写这里plunker更好地说明情况:https://plnkr.co/edit/axnR6t2Q82IVtzftq7y7?p=preview

我知道在这种情况下,我可以在控制器中使用不同名称的controllerAs,但我需要使其与指令(“restrict:A”指令)一起工作。

有人可以帮我解决这个问题吗?

回答

1

如果您没有为指令声明自己的作用域,那么指令作用域与控制器作用域相同,因此控制器和指令可以访问相同的作用域数据。如果您需要在指令中启动的控制器中执行某些操作,那么在控制器中使用$scope.watch监视范围变量。

如果您需要将变量从一个组件传递到另一个组件(控制器到指令或反之亦然),请使用服务。例如服务与getter和setter:在控制器

app.service("myService",function(){ 

    this.data; 

    this.setData=function(val){ 

    this.data=val; 
    }; 

    this.getData=function(val){ 

     return this.data; 

    }; 

}); 

添加服务,并使用setData,并把它添加到指令和调用getData

例控制器代码:

myService.setData(this.form); 

例指令

var form=myService.getData(); 
+0

我试着使用相同的$范围,按照你的建议,我更新了我的plunker:https://plnkr.co /编辑/ axnR6t2Q82IVtzftq7y7?p =预览 现在的问题是,我无法在我的控制器中获得self.parent ... – wizzy

+0

@wizzy var self = this; self是局部变量,不能从指令访问。 –

+0

谢谢...所以,如果我明白了,我唯一的解决方案是使用服务... 问题是,如果我没有错,服务(和我存储在其中的数据)在我的应用程序中仍然存在生活......但我只在我的控制器中需要他们时,我打电话给我的路由器视图...我不会增加我的应用程序的足迹! – wizzy

相关问题