2014-07-24 195 views
0

因此,这不是典型的如何去做的问题。我知道这可以通过服务或工厂完成,但我想知道是否有人可以分享创建基本服务的优点/缺点,将其注入每个控制器,然后使用每个控制器的功能扩展服务。类似于下面的示例..AngularJS,在控制器之间共享数据

app.service('HelperService', function() { 
    return {}; 
}); 

app.controller('Controller1', function($scope, HelperService) { 
    $scope.somefunc = function() { 
     //do stuff here 
    }; 
    HelperService.somefunc = $scope.somefunc; 
}); 

app.controller('Controller2', function($scope, HelperService) { 
    HelperService.somefunc(); 
}); 

这个工程,运作良好。我对这个问题感到有点愚蠢,但是似乎我在这里错过了一些关于为什么没有使用或推荐的东西?

+0

服务是单身,所以你可以扩展它们。如果你有控制器添加功能,它会变得混乱,为什么不首先建立你的服务? – lucuma

+0

是的,不可否认,它可能会变得杂乱无章,并且在服务中做得更干净些。我只是好奇,如果有这样做的利弊(除了杂乱)。 – dferg

+0

考虑尝试*维护*更大的应用程序,其中控制器将功能添加到服务和其他控制器中,调用这些功能。 – lucuma

回答

0

该服务是一个单例,它将在函数本身调用new后实例化 - 您传入的函数本质上是一个构造函数。这会创建空的对象,你可以在任何地方使用,但是如果你想以这种方式返回一个对象,那么使用.factory更合理,但这不是什么大不了的事。

无论如何,你可以考虑你的代码在概念上做到这一点:

var HelperService = function() {} 
var helperService = new HelperService; 

function Controller1() { 
    helperService.someFunc = function() {} 
} 
function Controller2() { 
    helperService.someFunc(); 
} 

我会认为这是一个危险的事情了几个理由这样做:

  1. Controller1必须实例Controller2之前或somefunc将不会提供给Controller2。理想情况下,管制员不会彼此了解。
  2. 您将Controller/ViewModel(因为您使用范围)与服务级别逻辑耦合在一起,但这些应该是分离的。 HelperService也不应该知道控制器。相反,您应该注入一个具有控制器期望使用的API的服务。这并不总是必须是HelperService,它只需要看起来像HelperService控制器和它的API不应该改变。

不知道你想做什么的具体细节,很难提供建议。一般来说,您可能会重新考虑您想要做什么,但您可以使用其他服务来扩展服务的功能。考虑将服务置于其自己的层面。

1

它可能工作,但它是一个坏主意。

  • 控制器2 HelperService.somefunc()不会存在,直到Controller1已经被实例化。因此,在一个地方,它可以被理解起来
  • 如果你正在做某种数据操作在功能那里有的Controller2Controller1
  • HelperService代码隐式的依赖是不是,真的应该在操作由HelperService封装的数据。
相关问题