5

自解释提琴: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!'; } 
     }; 
    }); 

我使用$喷油器服务尝试:

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

但是这给:“未知提供者:InnerCtrlProvider < - InnerCtrl”

我也想过用$控制器服务:

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

但是这给了我 “未知提供商:$ scopeProvider < - $范围”。我知道我可以创建一个范围来传入,但我觉得angular应该会自动为我解决范围和服务依赖关系。

如何从其名称中解析出控制器函数作为字符串及其相关性,以便将其分配给作用域变量?

回答

2

我一直在寻找同样的事情,现在几个小时后,终于它的工作原理:

可以使用$控制器 - 服务,但你注意到了,你需要自己创建范围:

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

别担心,所有其他变量都会被正确注入,但Angular无法自行创建新的作用域。如果你想将控制器添加HTML中,这是一个比较复杂一点,你需要在$范围功能,暴露了控制器的构造函数:

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

在HTML中,你可以以后用它一如既往:<ANY ng-controller="InnerCtrl"></ANY>

我写了一个post关于它的一些额外的细节,但这是主要解决你的问题。

相关问题