我正在尝试使用 Nativescript + Angular2,并且我在 tutorial 中阅读了以下内容:
We’ll build this functionality as an Angular service, which is Angular’s mechanism for reusable classes that operate on data.
然后他们要做的是创建一个简单的类,如下所示:
import { Injectable } from "@angular/core";
import { User } from "./user";
@Injectable()
export class UserService {
register(user: User) {
alert("About to register: " + user.email);
}
}
现在,我真的看不出普通类和服务之间的区别 - 这是一个非常普通的类定义。
那么,为什么它被称为“Angular 服务”?
This creates a basic Angular service with a single method that takes an instance of the User object you created in the previous section.
此外,当在教程中使用这个“服务”时,我不清楚这个类何时实例化 - 何时执行构造?该对象是否保存在内存中以供以后使用?教程中对“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...
}
最佳答案
在这种情况下,类是与任何其他 OO 语言中一样的常规类:对象的“原型(prototype)”,您可以简单地使用它来创建实例:
let myInstance = new MyClass(<arguments...>);
所以,实际上,Angular 服务也是一个类。
但是将服务视为一种特殊类。常规类和服务类之间的主要区别在于它们的生命周期,特别是谁创建了它们的实例(谁调用 new
)。
服务的实例由 Angular“容器”(实际上是 angular injector )创建并管理(处置)。
您还可以在其他服务类(或其他托管组件)的构造函数中“注入(inject)”服务类的实例。
服务能力方面的一个很好的资源是 Angular's Dependency Injection Guide 。
When is the construction executed?
注入(inject)器执行构造。什么时候?见下文。
Is the object saved in memory for later use?
可能是这样。取决于您注册服务的位置。
首先,请知道 Angular DI 是 hierarchical injection system .
如果您使用 Angular 模块注册服务,该服务将由应用程序的根注入(inject)器创建。因此,它下面的每个人(也称为该模块中的每个人)都将收到相同的服务实例。换句话说,Angular(仅调用注入(inject)器一次)将仅创建服务类的一个实例,并将同一实例传递给请求该服务的任何人。只要该模块存在,该实例就会存在。
现在,如果您向组件注册服务,那么该服务将向该组件的注入(inject)器注册。因此,当此类组件请求服务实例时,Angular 将调用注入(inject)器并创建一个实例。如果该组件的任何子组件请求此类服务的实例,Angular 将提供相同的实例。没有其他人,只有组件的子组件会收到同一实例。当该组件终止时,服务实例也会终止。
How does a "regular class" differ? It lacks the Injector?
区别不仅仅在于缺少注入(inject)器。
除了 Angular 之外,还有 JavaScript:您可以通过调用 let instance = new MyRegularClass()
创建“常规类”的实例。在你的代码中的某个地方,对吗?
这个instance
没有“神奇效果”,它的作用与任何类相同(只是常规的 JavaScript 方法和属性)。示例:如果您需要其他类的实例作为构造函数中的参数,则没有人会“神奇地”为您创建这些实例并传递它们。当调用 new
时,您必须手动创建它们(例如 new MyClass(new SomeOtherClassIDependOn(), ...)
)。如果你想实例化SomeOtherClassIDependOn
仅一次并在需要的地方重复使用相同的实例,您必须保存该实例并将其传递到需要的地方。
不过,作为服务,Angular 可以减轻您肩上的一些负担。
现在,最重要的是:由于每项服务在本质上都是一个类,因此必须有人调用 new MyServiceClass()
。不同的是,某人不再是你了。没有new UserService()
在你的代码中。那么,是谁呢?这个人就是Injector .
当 Angular 注意到有人请求服务时,它会调用注入(inject)器来实例化该服务。然后注入(inject)器调用 let serviceInstance = new MyServiceClass(<dependencies>)
并向其添加一些“魔法”(例如,它可以将其他服务的实例传递给服务的构造函数),并使其可供任何请求该服务的人使用(保存)您注册的范围。
注意:您可以调用new UserService(...)
你自己,因为它UserService
是一个类。但这个实例是一个常规对象,不是由 Angular 管理的,没有魔法(不会注入(inject)构造函数参数,不会保存和重用实例)。
关于javascript - NativeScript:类和服务之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48788259/