2015-06-03 553 views
8

我有一個控制器我覺得作爲我的「根」控制器「當前」的範圍,它是一個與ng-controller屬性聲明,即通過動態實例化,然後其他幾個控制器$routeProvider。我想聲明一個函數,該函數將通過任何動態/子控制器範圍內的ng-click屬性提供。訪問從「根」控制器

我可以我的根控制器,例如在聲明函數

$scope.announce = function() { 
    alert($scope.specificName); 
} 

然後我看到它在所有範圍爲所有的「孩子」的控制器,但在這個函數中使用$scope是本地的根控制器,而不是當前活動的範圍/控制器。如何訪問此功能中的活動子範圍?

+0

你可以添加一些你的函數的用例嗎? (您是否在ng-click?內使用其他函數?等等) – Okazari

+1

您始終可以使用工廠和事件發射器在控制器之間進行通信。我有一個菜單控制器,每次登錄或註銷時都會更新,或者添加一些東西到購物籃中,類似的東西......我不知道這是否與此相同? –

回答

3

你可以只通過子範圍的參數:

在你的 「根」 控制器:

$scope.announce = function (childScope) { 
    alert(childScope.specificName); 
}; 

在你的 「孩子」 控制器:

$scope.announce($scope); 

或者,因爲你需要調用從ng-click功能:
在你的「孩子」控制器:

$scope.callAnnounce = function(){ 
    $scope.announce($scope) 
}; 

這樣做的好處是,您可以在您的子控制器中擁有相同的代碼,並且只需修改根控制器中的函數,就必須編輯該功能。

+0

這意味着我必須聲明一個函數,在每個子控制器中調用'announce',這是我想避免的,但是如果必須的話,這不是一個火車粉碎。 – ProfK

+1

呃,不,你不知道。您可以在根控制器中聲明通告函數。然後,你可以簡單地在你的子控制器中使用它 – Cerbrus

+0

我想從'ng-click'函數調用'announce',我認爲這個函數必須將'$ scope'傳遞給'announce',而且在我看來該功能將不得不存在於每個控制器中。 – ProfK

5

我有東西在這個plunker覆蓋一些usecases工作。

該函數將帶有一個參數。該參數在每個範圍內都具有相同的名稱。

<body ng-app="MyApp"> 
    <div ng-controller="mainCtrl"> 
    <button ng-click="announce(specificName)">announce in main</button> 
    <div ng-controller="subCtrl"> 
     <button ng-click="announce(specificName)">announce in sub</button> 
    </div> 
    </div> 
</body> 

你主控制器看起來像:

angular.module('MyApp').controller('mainCtrl', function($scope, ItemService){ 

    $scope.specificName = "I'm main !"; 
    $scope.announce = function(specificName){ 
     alert(specificName); 
    } 

}); 

而只是覆蓋在子控制器中的 「specificName」 VAR:

angular.module('MyApp').controller('subCtrl', function($scope, ItemService){ 

    $scope.specificName = "I'm a sub !"; 

}); 

要呼叫純JS的功能,您可以爲此在每個控制器:

$scope.announce($scope.specificName); 

編輯:

我剛剛意識到有一個其他的解決方案,可以滿足您的需求。您可以使用工廠或服務來共享該功能。

如何服務可以看看:

myApp.service("AnnounceService", 
    function(){ 
     var service = {}; 

     service.announce = function(toAnnounce){ 
       alert(toAnnounce); 
     } 

     return service; 
    } 
); 

如何使你的控制器看起來像:

angular.module('MyApp').controller('subCtrl', function($scope, AnnounceService){ 

    $scope.announce = AnnounceService.announce; 
    $scope.specificName = "I'm a sub !"; 

    //Equivalent 
    $scope.announce($scope.specificName); 
    AnnounceService.announce($scope.specificName); 

}); 

這是同樣的事情,你需要聲明specificName每個控制器並將它傳遞給功能。但是,該功能將可用於您的應用程序的任何部分。你只需要注入的服務和

詳情:

最後抽象的部分沒有功能,但在每個控制器與您的經銷商的名稱。一種常規的命名。

如果此變量與狀態相關,則可以將其添加到狀態定義中。 (如果是這種情況,我可以嘗試給你一個例子。)

我也不建議給所有人一個完整的$範圍給另一個。這在角度上不是一個好習慣。

希望這能解決您的問題,或者提供足夠的線索。

隨意問更具體的事情,我會編輯答案,以適應您的需求。

+1

感謝你提供了一個非常有用的答案,但是Cerbrus首先解決了我的問題。 – ProfK

+1

@ProfK是的,但請記住,你不應該給一個函數一個完整的範圍。這不是一個好習慣。 – Okazari