我有一些网站特定的设置,我的模块将需要API调用和那种事情.我只是想知道制作可配置模块的方式是什么.显然,我不想为每个网站修改我可重用的JS文件,因为这样做就失败了.看到每个网站的价值观将保持不变,似乎在每个函数调用中作为参数传递他们似乎是一个非常麻烦的麻烦,我宁愿尽可能远离全局变量.
我搜索了很多关于我寻求的答案的问题,而我迄今发现的最接近的模式是让我的可重用模块依赖于一个不包含的模块,名为“settings”或者某些东西,然后在页面的JS文件,允许可重用的模块从中拉取值. Here’s an example to show what I mean.
这似乎倒退了我.这有点像一个函数从全局值中抽取值,而不是将值作为参数传递.
这真的是最好的做法吗,还是有替代方法?
解决方法
You should use the Provider recipe only when you want to expose an API for application-wide configuration that must be made before the application starts. This is usually interesting only for reusable services whose behavior might need to vary slightly between applications.
以下是提供者的一个非常基本的例子:
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一样,但提供了一个在config时可用的附加API,即setText方法.您可以访问配置块中的提供程序:
myMod.config(function(greetingProvider) { greetingProvider.setText("Howdy there,"); });
现在,当我们注入问候服务时,Angular会调用提供程序的$get方法(注入它在其参数中要求的任何服务),并给出它返回的任何东西;在这种情况下,$get返回一个函数,当使用名称调用时,将使用setText设置的任何值来提醒名称:
myMod.run(function(greeting) { greeting('Ford Prefect'); }); // Alerts: "Howdy there,Ford Prefect"
这正是其他提供商,如$httpProvider和$routeProvider的工作原理.
有关提供商和依赖注入的更多信息,请参阅this SO question on dependency injection.