2016-09-07 54 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

相關問題