什么时候使用 AngularJS 服务?
When to use AngularJS service?
我正在自学使用 AngularJS 编程。
作为学习练习,我正在尝试重写我使用 jQuery 编写的应用程序以使用 Angular。
程序在 canvas
元素上绘制分形图像。用户将数据输入到描述要绘制的分形的表格中,然后单击按钮。当用户点击按钮时,程序绘制分形。
创建一个 Angular 控制器来绑定表单上的数据对我来说似乎相当简单。
接下来,我问自己如何使用 Angular 进行实际绘图。在我正在阅读的一本书中,它说要为 "business logic" 使用 "drives the application" 的服务,而不是表示逻辑。
很好,但是...我现有的代码已经提供了 API 来绘制分形。在我看来,我需要做的就是绑定用户在填写表单后单击的 [Draw] 按钮,以便它调用我现有的代码。我的书似乎建议我应该创建一个 "Drawing Service" 并将其注入我的控制器;然后控制器应该在服务上调用一个方法并从表单中传递配置。
我觉得这听起来不错,但我问自己...为什么要这样做?为什么不直接让我的 Angular 代码按现在的方式调用我的绘图函数,而不是将其放在服务中?
我认为 Angular 的某些方面我没有掌握,所以我希望了解为什么我应该使用服务。
澄清一下,我不是询问.service
和.factory
之间的区别
如果您使用服务而不是仅仅使用您的 api,则您创建了该 API 的可注射版本。这对于单元测试非常有用。我在我的应用程序中使用 lodash,有时使用 TweenLite,我总是将它们包装在一个服务中并将它们注入我的控制器,这样当我编写单元测试时,模拟它们更容易并且不会创建 "untestable" 代码。拥有可注入服务还可以让您知道您的控制器依赖于该服务,而不仅仅是使用在外部库中创建的全局变量。
如果您需要配置您的 API/library,这也会有所帮助,那么您只需在服务中配置一次,其他任何地方都会受益。
这只是针对您的情况,在一般情况下,最好将您的所有逻辑都放在一个服务中,这样它就可以在任何地方重复使用。控制器几乎是应用程序中将数据(服务)粘附到视图的粘合剂
Why not simply have my Angular code call my drawing function the way it is now instead of putting it in a service?
这类似于问我们为什么要遵循 MVC 结构,因为我们可以将所有代码放在一个地方,一个文件中。
我想重点是让服务做 "work" 的事情,而控制器服务器只是 "connect" 工作结果与演示文稿。按功能分离代码 - 您的文档说得对。是的,有时做那样的事情没有意义,而且看起来有点矫枉过正……有时确实如此,但大多数时候它非常有用,不仅可以强迫自己以正确的方式学习,而且如果您现有的应用程序需要具有 additional/modified 功能,在多个 controllers/app 等中使用它,也可以减少头痛……并避免 "I wish I did it the right way in the beginning" 场景。
您永远不会真的需要使用服务。但是,在更大规模的应用程序中,分离控制器和服务之间的逻辑允许您分离(解耦)应用程序的逻辑。
如果您在应用程序的多个不同区域重复使用相同的逻辑,或者服务实现足够复杂以保证独立测试或隔离,则服务最有用。用 10 行代码测试服务比尝试测试这 10 行代码是否在与其他功能混合的控制器中工作要容易得多。
如果您在多个开发人员环境中工作,拥有一项服务将允许 UI 方面的专家独立于无所不知的人在 UI 上工作关于此特定功能的运作方式。
只有您可以确定何时绝对需要服务,但大多数敏捷开发人员会尽可能地支持服务,并且只在控制器中使用内联函数来处理琐碎的流程。
我正在自学使用 AngularJS 编程。
作为学习练习,我正在尝试重写我使用 jQuery 编写的应用程序以使用 Angular。
程序在 canvas
元素上绘制分形图像。用户将数据输入到描述要绘制的分形的表格中,然后单击按钮。当用户点击按钮时,程序绘制分形。
创建一个 Angular 控制器来绑定表单上的数据对我来说似乎相当简单。
接下来,我问自己如何使用 Angular 进行实际绘图。在我正在阅读的一本书中,它说要为 "business logic" 使用 "drives the application" 的服务,而不是表示逻辑。
很好,但是...我现有的代码已经提供了 API 来绘制分形。在我看来,我需要做的就是绑定用户在填写表单后单击的 [Draw] 按钮,以便它调用我现有的代码。我的书似乎建议我应该创建一个 "Drawing Service" 并将其注入我的控制器;然后控制器应该在服务上调用一个方法并从表单中传递配置。
我觉得这听起来不错,但我问自己...为什么要这样做?为什么不直接让我的 Angular 代码按现在的方式调用我的绘图函数,而不是将其放在服务中?
我认为 Angular 的某些方面我没有掌握,所以我希望了解为什么我应该使用服务。
澄清一下,我不是询问.service
和.factory
如果您使用服务而不是仅仅使用您的 api,则您创建了该 API 的可注射版本。这对于单元测试非常有用。我在我的应用程序中使用 lodash,有时使用 TweenLite,我总是将它们包装在一个服务中并将它们注入我的控制器,这样当我编写单元测试时,模拟它们更容易并且不会创建 "untestable" 代码。拥有可注入服务还可以让您知道您的控制器依赖于该服务,而不仅仅是使用在外部库中创建的全局变量。
如果您需要配置您的 API/library,这也会有所帮助,那么您只需在服务中配置一次,其他任何地方都会受益。
这只是针对您的情况,在一般情况下,最好将您的所有逻辑都放在一个服务中,这样它就可以在任何地方重复使用。控制器几乎是应用程序中将数据(服务)粘附到视图的粘合剂
Why not simply have my Angular code call my drawing function the way it is now instead of putting it in a service?
这类似于问我们为什么要遵循 MVC 结构,因为我们可以将所有代码放在一个地方,一个文件中。
我想重点是让服务做 "work" 的事情,而控制器服务器只是 "connect" 工作结果与演示文稿。按功能分离代码 - 您的文档说得对。是的,有时做那样的事情没有意义,而且看起来有点矫枉过正……有时确实如此,但大多数时候它非常有用,不仅可以强迫自己以正确的方式学习,而且如果您现有的应用程序需要具有 additional/modified 功能,在多个 controllers/app 等中使用它,也可以减少头痛……并避免 "I wish I did it the right way in the beginning" 场景。
您永远不会真的需要使用服务。但是,在更大规模的应用程序中,分离控制器和服务之间的逻辑允许您分离(解耦)应用程序的逻辑。
如果您在应用程序的多个不同区域重复使用相同的逻辑,或者服务实现足够复杂以保证独立测试或隔离,则服务最有用。用 10 行代码测试服务比尝试测试这 10 行代码是否在与其他功能混合的控制器中工作要容易得多。
如果您在多个开发人员环境中工作,拥有一项服务将允许 UI 方面的专家独立于无所不知的人在 UI 上工作关于此特定功能的运作方式。
只有您可以确定何时绝对需要服务,但大多数敏捷开发人员会尽可能地支持服务,并且只在控制器中使用内联函数来处理琐碎的流程。