javascript - NativeScript:类和服务之间的区别?

标签 javascript angular nativescript angular2-services angular2-nativescript

我正在尝试使用 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/

相关文章:

javascript - Atom 错误的自动完成

javascript - 动态加载图像,图像错误时中断循环

angular - 使用 formBuilder 验证正则表达式时出错

Nativescript - 更改启动屏幕

javascript - AngularJS 按空格键调用 href (ui-router)

c# - 动态获取照片?

spring - 预检响应具有无效的 HTTP 状态代码 403 + angular 2 + Java Spring boot

组件模块中的 Angular Material 拖放

android - 有没有办法在 NativeScript 中播放视频?

javascript - Nativescript ListView在页面加载时加载更多内容