2016-03-21 2 views
0

В моей routeProvider, я использую resolve вариант (user) для извлечения пользовательских данных:угловых инъекционный с использованием данных разрешать маршрут

// route.js 
$routeProvider 
    .when('/view', { 
     templateUrl: 'home.html', 
     controller: 'ViewController', 
     resolve: { 
      user: getUser // some promise that resolves a user object 
     } 
    }); 

<body ng-app="app"> 
    <nav ng-controller="NavController"></nav> 
    <main ng-view=""> 
     {{user | json}} 
    </main> 
</body> 

Это прекрасно работает, когда я прохожу user в мой маршруте контроллеры.

Но, то <nav> HTML выдает ошибку, я предполагаю, что, поскольку он не находится внутри этого ng-view тега

// Controller.js 
angular.module('Controllers', []) 
    .controller('NavController', ['$scope', 'user', function($scope, user){ 
     $scope.user = user; // broken! 
    }) 
    .controller('ViewController', ['$scope', 'user', function($scope, user){ 
     $scope.user = user; // works! 
    }); 

Error: [$injector:unpr] Unknown provider: userProvider <- user <- NavController

Кто-нибудь знает, как я могу получить разрешенные данные (user) в «внешний» контроллер, например, навигация?

+1

AFAIK вы не можете вводить 'user' в' NavController', потому что вы объявляете его внутри представления. Используйте службу или любой другой метод, чтобы получить текущего пользователя в этом контроллере –

+0

используйте сервис или оберните оба ваших контроллера в родительском контроллере, который они могут наследовать от – atsituab

ответ

0

Это невозможно, возможно, это разрешение данных в службу данных, которая будет содержать данные пользователя, а затем вы можете получить доступ к данным с помощью службы с любого выбранного вами контроллера.

2

Вы могли бы сделать то, что люди, комментирующие на своем посту предложили следующим образом:

$routeProvider 
    .when('/view', { 
     templateUrl: 'home.html', 
     controller: 'ParentController', 
     resolve: { 
      user: function(UserService){ 
       return UserService.getUser(); 
      } 
     } 
    }); 

Ваши контроллеры затем будет что-то вроде:

angular.module('Controllers', []) 
    .controller('ParentController', ['$scope', 'user', function($scope, user){ 
     $scope.user = user; 
    }])  
    .controller('NavController', ['$scope', function($scope){ 
     $scope.user = $scope.user; // now works! 
    }]) 
    .controller('ViewController', ['$scope', function($scope){ 
     $scope.user = $scope.user; // works! 
    }]); 

И, наконец, ваши контроллеры будут называться как :

<div ng-controller="ParentController"> 
    <div ng-controller="NavController"></div> 
    <div ng-controller="ViewController"></div> 
</div> 

Однако я бы не советовал это. Оба NavController и ViewController наследуют область действия ParentController, и поэтому нет ничего, что помешает вам изменить значение пользователя, поскольку оно наследуется по дереву. Было бы намного лучше извлечь этот пользовательский объект в службу, к которой могут иметь доступ как NavController, так и ViewController.

Надеюсь, это поможет!

Смежные вопросы