2016-08-24 6 views
0

У меня есть родительский угловой контроллер, который имеет метод, который должен использоваться совместно с каким-либо другим контроллером. Родитель контроллер выглядит следующим образом:Использование объектов в дочернем контроллере из родительского контроллера в Angular

"use strict"; 

(function() { 

var ParentCtrl = function($scope, atomico, Asset) { 

var _this = this; 

_this.busy   = atomico.identity == null; 
_this.oldestTimestamp = null; 

_this.assets = []; 

/** 
* Infinite scrolling, fetches more assets when the user scrolls down. 
*/ 
_this.fetch = function() { 
    if (_this.noMoreAssets) { return; } 

    _this.busy = true; 

    Asset.all(atomico.metadata['campaign'].id, _this.oldestTimestamp, $scope.dates.start, $scope.dates.end, function(assets) { 
    _this.busy = false; 

    if (assets.length > 0) { 
     _this.assets = _this.assets.concat(assets); 

     _this.oldestTimestamp = moment(assets[assets.length - 1].start).unix(); 
    } else { 
     _this.noMoreAssets = true; 
    } 
    }); 
}; 

}; 

ParentCtrl.$inject = [ '$scope', 'atomico', 'Asset' ]; 

angular.module('myModule').controller('ParentCtrl', ParentCtrl); 

})(); 

Я простирающийся этот контроллер в другой, чтобы иметь бесконечную прокрутку для работы в представлении. Это контроллер ребенок:

"use strict"; 

(function() { 

var ChildCtrl = function(atomico, userState, $controller, $scope) { 

var _this = this; 

angular.extend(_this, $controller('ParentCtrl', {$scope: $scope})); 

// Fetch assets after user, campaign and account data is available. 
atomico.ready(function(){ 
    var dates = userState.getCampaignViewData(atomico.metadata['campaign'].id).list_view; 
    $scope.dates = _.isEmpty(dates) ? {start: moment(), end: moment()} : dates; 
    _this.busy = false; 
}); 
}; 

CampaignListCtrl.$inject = [ 'atomico', 'userState', '$controller', '$scope' ]; 

angular.module('myModule').controller('ChildCtrl', ChildCtrl); 

})(); 

И на мой взгляд, у меня есть это:

<div id='agenda_viewer' ng-controller="ChildCtrl as ctrl"> 
    <p class="at-text-center at-block-center c-empty-list" ng-hide='ctrl.assets.length || ctrl.busy'> 
     There are no assets to show for this day 
    </p> 
    <div class="agenda-flight__content at-row" infinite-scroll='ctrl.fetch()' infinite-scroll-disabled='ctrl.busy' infinite-scroll-parent="true"> 
     <div class="agenda-flight at-row agenda-asset__live" ng-repeat='asset in ctrl.assets' ng-init='asset.collapsed = false'> 
      <directive-list-row asset='asset'></directive-list-row> 
      <directive-list-expanded asset='asset' ng-if='asset.collapsed'></directive-list-expanded> 
     </div> 
    </div> 
    <div class='c-loading' ng-show='ctrl.busy'>Loading data...</div> 
</div> 

Проблема я имею в том, что ctrl.assets всегда пусто, даже думал, что служба возвращает данные. Это проблемы с ctrl.assets, которые определены в родительском контроллере и не отображаются в дочернем контроллере? Как я могу сделать объект объектов общим для дочернего контроллера, чтобы я мог видеть данные в пользовательском интерфейсе?

ответ

0

Что я в итоге сделал, переместив некоторые из этих переменных контроллера в $scope и теперь, похоже, работает хорошо. $scope распространяется на детей