我已经看到angular.factory()和angular.service()都用于声明服务;但是,我在官方文档中找不到 angular.service
任何地方。
两种方法有什么区别?
应该使用哪个(假设他们做不同的事情)?
angular.service('myService', myServiceFunction);
angular.factory('myFactory', myFactoryFunction);
直到我以这种方式对自己说:
服务 :您编写的 函数 将是 新的 -ed:
myInjectedService <---- new myServiceFunction()
Factory* :将 调用 您编写的 函数 (构造函数): *
myInjectedFactory <--- myFactoryFunction()
您可以根据自己的意愿进行操作,但是有一些有用的模式…
function myServiceFunction() {
this.awesomeApi = function(optional) {
// calculate some stuff
return awesomeListOfValues;
}
}
---------------------------------------------------------------------------------
// Injected in your controller
$scope.awesome = myInjectedService.awesomeApi();
function myFactoryFunction() {
var aPrivateVariable = "yay";
function hello() {
return "hello mars " + aPrivateVariable;
}
// expose a public API
return {
hello: hello
};
}
---------------------------------------------------------------------------------
// Injected in your controller
$scope.hello = myInjectedFactory.hello();
function myFactoryFunction() {
return function() {
var a = 2;
this.a2 = function() {
return a*2;
};
};
}
---------------------------------------------------------------------------------
// Injected in your controller
var myShinyNewObject = new myInjectedFactory();
$scope.four = myShinyNewObject.a2();
两者都可以完成相同的事情。但是,在某些情况下, 工厂
为您提供了一些灵活性,可以使用更简单的语法创建可注射的对象。这是因为myInjectedService必须始终是对象,而myInjectedFactory可以是对象,函数引用或任何值。例如,如果您编写了一个用于创建构造函数的服务(如上面的上一个示例中所示),则必须将其实例化为:
var myShinyNewObject = new myInjectedService.myFunction()
可以说这是不那么理想的:
var myShinyNewObject = new myInjectedFactory();
(但是您首先应该警惕使用这种类型的模式,因为控制器中的 新
对象会创建难以跟踪的依赖关系,而这些依赖关系很难模拟以进行测试。最好让服务来管理用于以下目的的对象集合你比new()
狡猾地使用。)
还要记住,在两种情况下,角度都可以帮助您管理单例。无论您在何处或多少次注入服务或功能,都将获得对相同对象或功能的相同引用。(除了工厂何时仅返回数字或字符串之类的值。在这种情况下,您将始终获得相同的值,而不是引用。)
问题内容: 我是一个有角的新手,正在构建一个应用程序,让我感到困惑的是,有几种方法定义了服务,我从此链接中了解了更多:如何定义服务, 然后似乎没有太大的区别定义服务的方式。 但我只是注意到我认为是不同的一个不同之处: 看到我从这里得到的这项服务http://jsfiddle.net/2by3X/5/ 如果我使用如下所示的“工厂”定义此服务,则一个功能不能调用该服务的其他功能。 我将在浏览器控制台中
我正在尝试将服务人员添加到现有的angular(5.2,CLI 1.7.1)应用程序中。我做了我应该做的一切: > 我甚至尝试将这段代码(我在某处找到了解决方案)添加到main。ts 但我有一个错误: 未捕获(promise中)DOMExc0019:注册ServiceWorker失败:脚本具有不受支持的MIME类型('text/html')。 错误:未捕获(promise中):安全错误:注册Ser
旋转 你可以通过对一个精灵的rotation设定一个角度来旋转它。 cat.rotation = 0.5; 但是旋转是针对于哪一个点发生的呢? 你已经了解了,精灵的左上角代表它的位置,这个点被称之为 锚点 。如果你用像0.5这种值设定rotation,这个旋转将会 围绕着锚点发生 。下面这张图就是结果: 你能看见锚点是猫的左边耳朵(译者:对猫来说实际上是它的右耳朵!),那里成了猫的图片的旋转中心。
问题内容: 我有服务: 但是当我打电话时,我无法访问和获得。因此,对我而言,逻辑上的步骤是为save()提供,因此我还必须将其提供/注入到。因此,如果我这样做: 我收到以下错误: 错误:[$ injector:unpr]未知提供程序:$ scopeProvider <-$ scope <-StudentService 错误中的链接(哇,很干净!)让我知道它与注入器相关,并且可能与js文件的声明顺序
我已经在谷歌上搜索过了,但我找不到解决办法。 我已经使用这样的代码有一段时间了。http是http客户端。 我更新到最新的Angular 6。x版本和RxJS 6(来自5.5)。现在代码正在抱怨catchError: 类型“操作员函数”的参数不能分配给类型“操作员函数”的参数。参数“源”和“源”的类型不兼容。类型'可观察'不能分配给类型'可观察'。 我的HttpInterceptor现在也无法编译
我在这里编码了这个代码: V1和V2是两个向量,它们是保持简单的简单点()。现在我计算它们之间的角度,效果很好。但超过180度,它又回到179178度。。。但我想要360度。 问题是,例如弧度不会变为负值,所以我可以把它放在if段中。。。 谢谢你的建议。