AngularJS在其文档中明确指出“服务是单例”:
AngularJS services are singletons
违反直觉,module.factory
也返回一个Singleton实例。
鉴于非单例服务有很多用例,实现工厂方法以返回Service实例的最佳方法是什么,以便每次ExampleService
声明依赖项时,它的另一个实例都可以满足ExampleService
?
我认为我们不应该让工厂返回一个有new
能力的函数,因为这会开始破坏依赖注入,并且该库的行为会很尴尬,尤其是对于第三方。简而言之,我不确定非单项服务是否有合法的用例。
完成同一件事的更好方法是使用工厂作为API,以返回带有附加的getter和setter方法的对象集合。以下是一些伪代码,显示了使用这种服务的工作方式:
.controller( 'MainCtrl', function ( $scope, widgetService ) {
$scope.onSearchFormSubmission = function () {
widgetService.findById( $scope.searchById ).then(function ( widget ) {
// this is a returned object, complete with all the getter/setters
$scope.widget = widget;
});
};
$scope.onWidgetSave = function () {
// this method persists the widget object
$scope.widget.$save();
};
});
这只是伪代码,用于通过ID查找小部件,然后能够保存对记录所做的更改。
这是该服务的一些伪代码:
.factory( 'widgetService', function ( $http ) {
function Widget( json ) {
angular.extend( this, json );
}
Widget.prototype = {
$save: function () {
// TODO: strip irrelevant fields
var scrubbedObject = //...
return $http.put( '/widgets/'+this.id, scrubbedObject );
}
};
function getWidgetById ( id ) {
return $http( '/widgets/'+id ).then(function ( json ) {
return new Widget( json );
});
}
// the public widget API
return {
// ...
findById: getWidgetById
// ...
};
});
尽管没有包含在此示例中,但这些灵活的服务也可以轻松管理状态。
我现在没有时间,但是如果有帮助,我可以稍后整理一个简单的Plunker进行演示。
问题内容: 是否可以在angularJS中将一个服务注入到另一个服务中? 问题答案: 是。遵循angularjs中的常规注入规则。 感谢@simon。最好使用数组注入以避免最小化问题。
本文向大家介绍AngularJS 单元测试服务,包括了AngularJS 单元测试服务的使用技巧和注意事项,需要的朋友参考一下 示例 服务编号 考试 跑!
问题内容: 在参考资料中,我读到: 最后,重要的是要意识到所有Angular服务都是应用程序单例。这意味着每个喷油器只有一种给定服务的实例。 但是用这个简单的代码似乎不是一个单例 我有点困惑,你能解释一下我怎么了吗? 更新1 可能不是我不是棚里最犀利的工具,但是在@Khanh TO答复之后,这在参考文献中会是一个更好的解释,尚不十分清楚。 更新2 BOOM,这是一个单身人士! 更新3 但是如果你喜
问题内容: 在Angular中,所有内容似乎都具有陡峭的学习曲线,并且对Angular应用程序进行单元测试绝对不能逃脱这种范例。 当我开始使用TDD和Angular时,我觉得我花了两倍(可能更多)的时间来弄清楚如何测试,甚至花更多的时间来正确地设置测试。但是正如Ben Nadel 在他的博客中所说的那样,角度学习过程存在起伏。他的图表绝对是我在Angular的经历。 但是,随着我在学习Angula
问题内容: 众所周知,使用AngularJS时必须在指令内操作DOM元素。 但是,在某些用例中,在服务内部操作DOM似乎是可以接受的。Misko Hevery在这里谈论这个。您还可以在Bootstrap UI对话框中 找到示例。 Misko的解释很模糊,所以我想知道如何确定何时需要将DOM放入服务而不是指令中。 问题答案: 指令及其定义方式始终附加在DOM节点上。因此,当您定义指令时,它会“扩展”
问题内容: 我有以下angularjs服务: 如何从旧版js代码中调用函数? 问题答案: 使用angular.injector。使用您的代码,您可以执行以下操作: 这是jsfiddle:http : //jsfiddle.net/wGeNG/ 注意 -加载自定义模块之前,您需要添加“ ng”作为第一个模块,因为示例代码取决于ng模块中的$ http提供程序。 编辑 - 在OP的答案中使用, 但 请