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關於它的一些額外的細節,但這是主要解決你的問題。

相關問題