2012-12-11 40 views
0

因此,我的控制器的結構可能是由此造成的。在這裏,您可以看到parentchild控制器,但重要的部分是在這裏:加載或導航時,控制器加載順序不同

父控制器

//Load version 
$scope.person = People.people.get({ id: $routeParams.id}, function(person) { 
    var associations = { 
     events: person.events || [], 
     people: person.people || [], 
     places: person.places || [] 
    }; 
    $scope.$broadcast('setAssociations', associations); 
}); 
//Event version 
$scope.$on('getAssociations', function(e, args) { 
    var associations = { 
    events: $scope.person.events || [], 
    people: $scope.person.people || [], 
    places: $scope.person.places || [] 
    }; 
    $scope.$broadcast('setAssociations', associations); 
}); 

兒童控制器

$scope.$on('setAssociations', function(event, args) { 
    $scope.parentEvents = args.events; 
}); 

$scope.$emit('getAssociations', {}); 

的想法是,我需要將父母的person對象的events下載到子控制器。問題是,從母公司募集setAssociations的每種方法僅適用於一種情況。

load版本在頁面從應用程序(哈希,導航)內導航到時起作用。但是,當從外部重新加載或導航(滿載)時,子事件從未被提出,可能是因爲它尚未註冊其聽衆。

event版本在頁面刷新或導航到應用程序外部(導致頁面完全加載的任何內容)時起作用。導航到時,$scope爲空,但此方法失敗。

因此,當進行「深度鏈接」或刷新以及進行內部導航時,應用程序加載控制器的順序不同。 如何從具有父子關係的角度控制器獲得一致的負載行爲?

回答

5

從不同的角度看問題,由於子範圍原型繼承父範圍,這意味着我們在父範圍上定義的任何屬性都可以在子範圍中立即訪問......即使您將屬性添加到稍後在創建子作用域之後的父作用域。換句話說,你可能不需要使用事件來獲取你想要給孩子的信息。

如果您的問題僅僅是子範圍需要來自父範圍的某些信息,只需將該數據分配給新的父$ scope屬性,並讓您的子視圖訪問它。當它被定義時,它會出現在子視圖中。而不是var associations,請嘗試$scope.associations

這是一個contrived fiddle,它使用ng-click將一些數據添加到父範圍,然後在子視圖中變爲可見。

這是否解決您的問題?

+0

是的,謝謝你,這比我所做的要好得多。我在角度教程或概述中沒有看到這個地方!這是一個完美的技術,他們爲什麼不告訴你呢? – Tyrsius

+2

嗯,我應該提到以這種方式共享數據不是'最佳實踐',因爲這種方式假設了特定的父子DOM結構。如果你有一天決定讓孩子成爲同齡人而不是孩子,那麼這種技術就會失敗。首選技術是創建一個服務,並讓父控制器和子控制器注入該服務 - 函數MyCtrl($ scope,myService) - 並將共享數據存儲到服務中並從中訪問。示例小提琴:http://jsfiddle.net/whnSs/ –

+0

另請參見http://stackoverflow.com/questions/12008908/pass-variables-between-controllers –