2014-09-23 76 views
0

我迁移的AngularJS多页应用一个单页的应用程序,并且我有一些麻烦复制以下行为:不同的父控制器

每个HTML文件具有不同的基控制器和ng-view。例如,file1.html看起来是这样的:

<body ng-controller="BaseCtrl1"> 
    <!-- Routes to /view11, /view12, etc. with their corresponding controllers --> 
    <div ng-view></div> 
</body> 
<script src="file1.js"></script> 

file2.html使用BaseCtrl2,路由到/views21/view22等。每个这种控制器的初始化范围,及视相应子集共享模型的这一部分:

file1.js:

module.controller('BaseCtrl1', function($scope, ServiceA, ServiceB, ServiceC) { 
    // Populate $scope with ServiceN.get() calls 
    ServiceA.get(function(response) { 
    $scope.foo = response.results; 
    }); 
}); 
// ... 

file2.js:

module.controller('BaseCtrl2', function($scope, ServiceX, ServiceY) { 
    // Populate $scope with ServiceN.get() calls 
}); 
// ... 

然而,随着我无法为每个不同的视图组使用固定父控制器(在body元素中声明)的单页应用程序。我已经使用了$controller servicethe answer of this question试过,但我需要注入的子控制器父的所有依赖,并且看起来并不像一个整洁的解决方案都:

module.controller('View11Ctrl', function($scope, ServiceA, ServiceB, ServiceC) { 
    $controller('BaseCtrl1', {/* Pass al the dependencies */}); 
}); 

module.controller('View12Ctrl', function($scope, ServiceA, ServiceB, ServiceC) { 
    $controller('BaseCtrl1', {/* Pass al the dependencies */}); 
}); 

我想知道有一种方法可以通过初始化一组视图的“常见”部分范围来复制原始行为,并在更改路线时对其进行维护。

+1

你看过[AngularJS Inheritance Patterns](http://blog.mgechev.com/2013/12/18/inheritance-services-controllers-in-angularjs/)吗? – 2014-09-23 10:04:37

+0

此外,它看起来可以完全重用所有控制器方法中的相同功能。 – 2014-09-23 10:07:22

+1

另外,你可以嵌套控制器 - f.e.在外部标签上有BaseCtrl1,并且View11Ctrl只设置差异。范围是继承的。 – 2014-09-23 10:08:45

回答

1

您可以使用$injector.invoke()服务方法来实现此目的。

module.controller('View11Ctrl', function($scope, ServiceA, ServiceB, ServiceC) { 
    $injector.invoke(BaseCtrl1, this, { $scope: $scope }); 
} 

第三个参数被定义为:

如果预设然后任何参数名是从该对象首先,$注射器被咨询 之前读取。

这样您只需要将本地控制器传递给您的子控制器特定的基本控制器,并且所有其他基本控制器依赖项都将使用正常的$注入器DI来解决。

+0

$注入器的使用是对$控制器方法的改进,但是我我也在寻找“最佳实践”解决方案,所以我想知道它的使用有多常见(我没有看到任何控制器都使用这些服务的例子)。 – 2014-09-24 06:35:18