Как разрешить и назначить внутренний контроллер из внешней области?

Самоочевидная скрипка: http://jsfiddle.net/5FG2n/1/

Скажем, у меня есть представление с двумя контроллерами, один из которых содержит другой. Внешний контроллер является статическим, но мне нужно установить внутренний контроллер на основе переменной области видимости из внешнего. Переменная области видимости будет именем внутреннего контроллера в виде строки (например, 'InnerCtrl').

Вот вид:

<div ng-app='app' ng-controller='OuterCtrl'>
    <div ng-controller='dynamicCtrl'>
        {{result}}
    </div>
</div>

А вот модуль пока не правильный:

angular.module('app', [])

    .controller('OuterCtrl', ['$scope', 
        function($scope) {

            // Instead of hard coding the controller here,
            // how do I resolve the string 'InnerCtrl' to the 
            // controller function defined below, so it can be
            // assigned to this dynamicCtrl property?
            $scope.dynamicCtrl = function($scope) {
                $scope.result = 'not working yet';
            };

            //eg:
            //$scope.dynamicCtrl = resolveCtrl('InnerCtrl');                                               
        }
    ])

    .controller('InnerCtrl', ['$scope', 'service',
        function($scope, service) {
            $scope.result = service.getMessage();
        }
    ])

   .factory('service', function() {
       return {
           getMessage:  function() { return 'working!'; }
       };
    });

Я попытался использовать службу $injector:

$scope.dynamicCtrl = $injector.get('InnerCtrl');

Но это дает: «Неизвестный провайдер: InnerCtrlProvider ‹- InnerCtrl»

Я также думал об использовании сервиса $controller:

$scope.dynamicCtrl = $controller('InnerCtrl', {} /* don't want to hard code dependencies */);

Но это дает мне «Неизвестный провайдер: $scopeProvider ‹- $scope». Я знаю, что мог бы создать область для передачи, но я чувствую, что angular должен автоматически разрешать для меня области действия и зависимости службы.

Как определить функцию контроллера по ее имени в виде строки вместе с ее зависимостями, чтобы ее можно было назначить переменной области видимости?


person Mike Chamberlain    schedule 17.01.2014    source источник


Ответы (1)


Я искал то же самое, и теперь, через несколько часов, наконец, это работает:

Вы можете использовать $controller - сервис, но, как вы заметили, вам нужно создать область видимости самостоятельно:

$controller('InnerCtrl', { $scope: $scope.$new() } );

Не беспокойтесь, все остальные переменные будут внедрены правильно, но Angular не сможет создать новую область видимости самостоятельно. Если вы хотите добавить контроллер в свой HTML, это немного сложнее, вам нужно иметь функцию в $scope, которая предоставляет конструктор контроллера:

$scope.InnerCtrl = function() {
    return $controller('InnerCtrl', { $scope: $scope.$new() }).constructor;
}

В HTML вы можете впоследствии использовать его как всегда: <ANY ng-controller="InnerCtrl"></ANY>

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

person peter    schedule 15.10.2014