我一直在修改AngularJS,我已经建立了一小部分指令和服务,我想将它们打包成一个JS文件,以便我可以在任何地方使用它们。
我有一些网站特定的设置,我的模块将需要API调用等等。我只是想知道Angular制作可配置模块的方法是什么。显然,我不想为每个网站修改我的可重用JS文件,因为这样做会破坏它的目的。看到每个网站的值将保持不变,将每个函数调用作为参数传递它们似乎是一件非常麻烦的事情,而且我宁愿尽可能远离全局变量。
我已经针对我寻求的答案搜索了很多问题,而我迄今发现的最接近的模式是让我的可重用模块依赖于一个名为"设置& #34;或者其他什么,然后在页面的JS文件中定义该模块,允许可重用模块从中提取值。 Here's an example to show what I mean.
这似乎是我的倒退。它有点像从全局值中提取函数而不是将值作为参数传递。
这真的是最好的方法,还是有替代方案?
答案 0 :(得分:11)
听起来你正在寻找a provider。
只有在要为应用程序范围的配置公开API时才应使用提供程序配方,该配置必须在应用程序启动之前进行。这通常仅适用于可重用服务,其行为可能需要在应用程序之间略有不同。
以下是提供者的一个非常基本的例子:
myMod.provider('greeting', function() {
var text = 'Hello, ';
this.setText = function(value) {
text = value;
};
this.$get = function() {
return function(name) {
alert(text + name);
};
};
});
这会创建一项新服务,就像您使用myMod.service
或myMod.factory
一样,但会提供配置时可用的其他API,即setText
方法。您可以在config
块中访问提供商:
myMod.config(function(greetingProvider) {
greetingProvider.setText("Howdy there, ");
});
现在,当我们注入greeting
服务时,Angular将调用提供者的$get
方法(在其参数中注入它要求的任何服务),并为您提供它返回的任何内容;在这种情况下,$get
会返回一个函数,当使用名称调用时,它会使用setText
设置的任何内容提醒名称:
myMod.run(function(greeting) {
greeting('Ford Prefect');
});
// Alerts: "Howdy there, Ford Prefect"
这正是其他提供商(如$httpProvider
和$routeProvider
)的工作方式。
有关提供程序和依赖项注入的更多信息,请查看this SO question on dependency injection。