假设我们提供以下服务:
myApp.factory('FooService', function () { ...
然后,从控制器,我会说:
myApp.controller('FooCtrl', ['$scope', 'FooService', function ($scope, FooService) { ...
这个由两部分组成的问题是:
答案 0 :(得分:38)
找到合理的解决方案。将其注入引导方法(运行),并将其添加到根范围。从那里它将可用于所有控制器和视图。
myApp.run(function ($rootScope, $location, $http, $timeout, FooService) {
$rootScope.foo = FooService;
....
重新阅读上面提到的帖子,它没有说“完全包裹”......只是“抽象”,所以我认为海报是指同一个解决方案。
为了彻底,(1)的答案是:
myApp.controller('FooCtrl', ['$scope', function ($scope) {
// scope inherits from root scope
$scope.foo.doSomething();
...
和(2)的答案很简单:
{{doSomething()}}
添加克里斯托弗的评论,以确保它被看到:
@rob - 根据最佳实践,工厂应注入 到需要使用它的控制器,而不是根目录。 如上所述,第一个问题实际上是反模式。如果你需要 工厂100次,你注射100次。它几乎没有任何额外的东西 缩小代码,并清楚地说明工厂的使用位置, 它使测试这些控制器更容易(也更明显) 与模拟,通过所有工厂列出的所有工厂 功能签名。 - Christopher WJ Rueber 2013年11月25日20:06
答案 1 :(得分:6)
就直接在视图中访问服务而言,这看起来非常无棱角。将它绑定到控制器中的范围变量似乎比在UI中直接使用服务来帮助维护职责分离更好。
答案 2 :(得分:6)
补充问题#1(全局可访问性)我只会添加它以避免在最小化文件时出现问题(如果是这种情况),它应该这样写:
this.app.run(["$rootScope", "Foo", function($rootScope, FooService) {
return $rootScope.fooService = FooService;
}
]);