我试图进入Nativescript + Angular2,我在tutorial中阅读了以下内容:
我们将此功能构建为Angular服务,这是Angular用于对数据进行操作的可重用类的机制。
他们接下来要创建一个简单的类,如下所示:
import { Injectable } from "@angular/core";
import { User } from "./user";
@Injectable()
export class UserService {
register(user: User) {
alert("About to register: " + user.email);
}
}

现在,我无法真正看到普通类和服务之间的区别 - 这是一个非常正常的类定义。
那么,为什么它被称为" Angular服务"?
这将创建一个基本的Angular服务,其中包含一个方法,该方法接受您在上一节中创建的User对象的实例。
此外,使用此"服务"在本教程中,当实例化此类时,我不清楚 - 何时执行构造?对象是否保存在内存中供以后使用?对" userservice"的唯一调用在教程中是这样的:
import { Page } from "ui/page";
import { Component, ElementRef, OnInit, ViewChild } from "@angular/core";
import { User } from "../../shared/user/user";
import { UserService } from "../../shared/user/user.service";
import { Router } from "@angular/router";
import { Color } from "color";
import { View } from "ui/core/view";
@Component({
selector: "my-app",
providers: [UserService],
templateUrl: "./pages/login/login.html",
styleUrls: ["./pages/login/login-common.css", "./pages/login/login.css"]
})
export class LoginComponent implements OnInit {
user: User;
isLoggingIn = true;
@ViewChild("container") container: ElementRef;
constructor(private router: Router, private userService: UserService, private page: Page) {
this.user = new User();
this.user.email = "bla@bla.com";
this.user.password = "1234";
}
//.... methods and stuff...
}

答案 0 :(得分:2)
在该上下文中,类是任何其他OO语言的常规类:对象的“原型”,您可以使用以下方法创建实例:
let myInstance = new MyClass(<arguments...>);
所以,实际上,Angular服务 也是一个类。
但是考虑服务特殊类。常规类和服务类之间的主要区别是他们的生命周期,特别是谁创建他们的实例(谁调用new
)。
服务实例由Angular“容器”(实际上为angular injector)创建并管理(处置)。
您还可以在其他服务类(或其他托管组件)的构造函数中“注入”服务类的实例。
服务能力的良好资源是Angular's Dependency Injection Guide。
施工什么时候执行?
喷油器执行结构。什么时候?见下文。
对象是否保存在内存中供以后使用?
可能是。取决于您注册服务的位置。
在此之前,请知道Angular DI是hierarchical injection system。
如果您使用Angular模块注册服务,该服务将由应用程序的根注入器创建。因此,它下面的每个人(也就是该模块中的每个人)都将收到相同的服务实例。换句话说,Angular(将只调用一次注入器)将只创建一个服务类实例,并将该实例传递给要求该服务的任何人。只要该模块存在,该实例就会存在。
现在,如果您使用组件注册服务,那么该服务将注册到该组件的注入器。因此,当此类组件请求服务实例时,angular将调用注入器并创建实例。如果该组件的任何子项请求此类服务的实例,则angular将提供相同的实例。没有其他人,只有组件的子级,将接收相同的实例。当该组件死亡时,服务实例也会死亡。
“普通班级”有何不同?它缺少注射器?
不同之处不仅在于缺少注射器。
除了Angular,只需JavaScript:您可以通过在代码中的某处调用let instance = new MyRegularClass()
来创建“常规类”的实例,对吗?
这个instance
没有“神奇的效果”,它只会做任何类(只是常规的JavaScript方法和属性)。示例:如果在构造函数中需要其他类的实例作为参数,则没有人会“神奇地”创建这些实例并传递它们。调用new
时,您必须手动创建它们(例如new MyClass(new SomeOtherClassIDependOn(), ...)
)。如果您只想实例化SomeOtherClassIDependOn
一次并在需要的任何地方重复使用相同的实例,则必须保存该实例并将其传递给自己需要的任何地方。
作为服务,角度可以减轻你的负担。
现在,在任何事情之前:因为每个服务,在内心深处,是一个类,所以有人必须致电new MyServiceClass()
。不同的是,有人不再是你了。您的代码中没有new UserService()
。那么,是谁?这个人是Injector。
当Angular注意到有人要求提供服务时,它会要求注入器实例化该服务。然后,注入器调用let serviceInstance = new MyServiceClass(<dependencies>)
并向其添加一些“魔法”(例如,它可以传递 - 注入 - 其他服务的实例到服务的构造函数),并使其可用(保存)对于在您注册的范围内请求服务的任何人。
注意:您可以自己致电new UserService(...)
,因为UserService
是一个类。但是这个实例是一个常规对象,不是由angular管理的,没有魔法(没有注入构造函数参数,也没有保存和重用实例)。