2013-06-06 69 views
0

沒有訪問我有兩個嵌套的控制器:angularjs子控制器具有父

BuildingsShowCtrl = ($scope, $location, $routeParams, Building) -> 
    $scope.building = Building.get 
    id: $routeParams.id 

AddressesChildCtrl = ($scope, $routeParams, Address) -> 
    $scope.addresses = Address.query({building_id: $scope.building.id}) 

他們在我嵌套視圖這樣使用:

<div ng-controller="BuildingsShowCtrl"> 
    <h1>Building</h1> 

    <p> 
    <b>Name</b><br> 
    {{building.name}} 
    </p> 

    <p> 
    <b>Number</b><br> 
    {{building.number}} 
    </p> 
    <div ng-include="'/assets/addresses/index.html'"></div> 
</div> 

當我打刷新瀏覽器,它工作正常,但當我從建築物列表頁面點擊建築物時,它失敗了,因爲$ Scope.building在AddressesChildCtrl中未定義。

爲什麼沒有孩子控制器有機會獲得母公司控制的範圍在這種情況下?

應用程序是可見這裏:http://lgi.herokuapp.com/buildings/

THX!

+0

你能創建一個plunker代碼片段來檢查嗎?從源你已經張貼在那裏提出相關問題我看不到你用'''AddressesChildCtrl''' –

+0

我認爲你需要使用'$範圍$ parent.building'那裏 - 你可以試試這個檢查? – callmekatootie

回答

2

如果使用ngResource,Building.get將立即返回一個空對象,並在HTTP請求完成後異步填充對象數據(documentation)。你可以做這樣的事情來加載填充對象時的地址數據:

AddressesChildCtrl = function($scope, $routeParams, Address) { 
    $scope.$watch('building.id', function(newValue, oldValue) { 
    if (newValue) { 
     $scope.addresses = Address.query({building_id: $scope.building.id}) 
    } else { 
     $scope.addresses = [] 
    } 
    }, true); 
} 
+0

優秀,有效!你讓我今天一整天都感覺很好!是否需要$ watch,因爲否則,在收到來自Buildings的響應之前,查詢是在Address上執行的?謝謝! – ndemoreau

+0

手錶只是檢測建築物ID的變化。所以不確定=> 1,或1 => 2。如果你想等待建築加載,您將需要使用的承諾,這是不可用的股票'ngResource'在1.0.x中建立AngularJS的。您也可以將回調傳遞給'Building.get',但是您的控制器被拆分的方式可能很奇怪。 – rtcherry

+0

最後一個問題:這是否意味着,如果我用$ routeParams.id,這是一樣的building_id,這將載入速度? – ndemoreau

相關問題