从flask视角理解angular(三)ORM VS Service

把获取模型数据的任务重构为一个单独的服务,它将提供英雄数据,并把服务在所有需要英雄数据的组件间共享。

@Injectable()
export class HeroService {
  getHeroes(): void {} // stub
}

HeroService可以从任何地方获取Hero数据 —— Web服务、本地存储或模拟数据源。

Service不是new()出来的

文档里给出了李菊福的理由:

我们的组件得弄清楚该如何创建HeroService。 如果有一天我们修改了HeroService的构造函数,我们不得不找出创建过此服务的每一处代码,并修改它。 围着补丁代码转圈很容易导致错误,还会增加测试负担。

我们每次使用new都会创建一个新的服务实例。 如果这个服务需要缓存英雄列表,并把这个缓存共享给别人呢?怎么办? 没办法,做不到。

我们把AppComponent锁定到HeroService的一个特定实现。 我们很难在不同的场景中切换实现。 例如,能离线操作吗?能在测试时使用不同的模拟版本吗?这可不容易。

在app.component.ts里

import { Component, OnInit } from ‘@angular/core‘;

import { Hero } from ‘./hero‘;
import { HeroService } from ‘./hero.service‘;

@Component({
  selector: ‘my-app‘,
  template: `...‘,//略
  providers: [HeroService]
})
export class AppComponent implements OnInit {
  title = ‘Tour of Heroes‘;
  heroes: Hero[];
  selectedHero: Hero;

  constructor(private heroService: HeroService) { }

  getHeroes(): void {
    this.heroService.getHeroes().then(heroes => this.heroes = heroes);
  }

  ngOnInit(): void {
    this.getHeroes();
  }

  onSelect(hero: Hero): void {
    this.selectedHero = hero;
  }
}

1 import

2 在@Component里增加 providers: [HeroService]

3 在APPComponent的构造函数里传入constructor(private heroService: HeroService),这样直接有了heroService的私有属性,不需要在开头声明了

Model部分

类似 models.py 定义数据类型

export class Hero {
  id: number;
  name: string;
}

类似 models.py定义的ORM类。可以送进模板用双括号访问属性 {{hero.name}}

ng的双向绑定很给力。

<div>
  <label>name: </label>
  <input [(ngModel)]="hero.name" placeholder="name">
</div>
时间: 2024-10-28 23:14:09

从flask视角理解angular(三)ORM VS Service的相关文章

从flask视角学习angular

前端框架完全不懂. 看着angular中文官网的英雄编辑器教程和核心知识,用偷懒的类比法,从flask django的角度 记录一下自己对angular的理解. app.module.ts 这个文件有点类似extends.py 在这里import各种依赖的插件.比如要双向绑定,就要import  FormsModule import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platfor

(七)理解angular中的module和injector,即依赖注入

依赖注入(DI)的好处不再赘言,使用过spring框架的都知道.angularjs作为前台js框架,也提供了对DI的支持,这是javascript/jquery不具备的特性.angularjs中与DI相关有angular.module().angular.injector(). $injector.$provide.对于一个DI容器来说,必须具备3个要素:服务的注册.依赖关系的声明.对象的获取.比如spring中,服务的注册是通过xml配置文件的<bean>标签或是注解@Repository.

从Java视角理解CPU缓存(CPU Cache)

从Java视角理解系统结构连载, 关注我的微博(链接)了解最新动态众所周知, CPU是计算机的大脑, 它负责执行程序的指令; 内存负责存数据, 包括程序自身数据. 同样大家都知道, 内存比CPU慢很多. 其实在30年前, CPU的频率和内存总线的频率在同一个级别, 访问内存只比访问CPU寄存器慢一点儿. 由于内存的发展都到技术及成本的限制, 现在获取内存中的一条数据大概需要200多个CPU周期(CPU cycles), 而CPU寄存器一般情况下1个CPU周期就够了. CPU缓存 网页浏览器为了加

谁人能理解这三句对话中的心酸啊?!

问一神棍:“我什么时候才能不做程序猿?” 神棍掐指一算,答:”等你躺进棺材的时候.“ 我一把拉住神棍的双手,内牛满面的说:“大哥,谢谢噢,想不到我还能躺在棺材里,谢谢噢.” 这三句纯粹是我个人胡扯,不过说的也是真心话.别看貌似很搞笑,其实内里有很多心酸故事. 程序员?美其名曰软件工程师,其实腻,天朝下的程序员,小部分可称为码农(相对来说有点技术含量的),大部分可称为代码搬运工(每天就是 ctl+c / ctl+v  含金量几乎为0),只有大海捞针数量级的码神存在. 所以,福利待遇,薪金制度比“机

Android学习笔记十五.深入理解fragment(三) 之《兼容多分辨率的应用》实战

深入理解fragment(三) 之<兼容多分辨率的应用>实战 在上一篇博文中介绍了如何使用Android Fragment开发适用于大屏幕应用,现在我们在上一个应用的基础上继续学习如何使用Fragment开发兼容多分辨率的应用. 1.建立/res/values-large/refs.xml引用资源文件 为了开发兼顾屏幕分辨率的应用,我们需要建立一个引用资源文件,专门用于定义各种引用项.refs.xml引用资源文件中定义了一项引用,其作用就是标明activity_book_list实际引用(@)

理解angular中的module和injector,即依赖注入

依赖注入(DI)的好处不再赘言,使用过spring框架的都知道.angularjs作为前台js框架,也提供了对DI的支持,这是javascript/jquery不具备的特性.angularjs中与DI相关有angular.module().angular.injector(). $injector.$provide.对于一个DI容器来说,必须具备3个要素:服务的注册.依赖关系的声明.对象的获取.比如spring中,服务的注册是通过xml配置文件的<bean>标签或是注解@Repository.

Java 反射理解(三)-- Java获取方法信息

Java 反射理解(三)-- Java获取方法信息 基本的数据类型.void关键字,都存在类类型. 举例如下: public class ClassDemo2 { public static void main(String[] args) { Class c1 = int.class;//int 的类类型 Class c2 = String.class;//String类的类类型,可以理解为String类字节码 Class c3 = double.class; Class c4 = Doubl

Flask之初学者(三)

Flask数据库操作 一.MySQL数据库安装(我用的是解压版) 解压:将下载的zip包解压到任意目录: 配置环境变量:将解压后的文件夹中的bin目录路径放入环境变量的path中: 配置文件:在解压的文件夹下(也就是bin的上一级目录)新建一个ini配置文件如"my-default.ini"(如果有就是修改其中的内容),在配置文件中写入(修改或追加)如下内容: [mysqld] basedir=D:\MySQL Server 8.0 datadir=D:\MySQL Server 8.

学并发编程,透彻理解这三个核心是关键

写在前面 上一篇文章这次走进并发的世界,请不要错过 给大家带了并发编程的开胃菜,接下来我们逐步上正餐,在吃正餐之前,我还要引用那首诗词: 「横看成岭侧成峰,远近高低各不同」,远看看轮廓,近看看细节,不断切换思维或视角来学习 远看并发,并发编程可以抽象成三个核心问题: 分工.同步/协作.互斥 如果你已经工作了,那么你一定听说过或者正在应用敏捷开发模式来交付日常的工作任务,我们就用你熟悉的流程来解释这三个核心问题 分工 将当前 Sprint 的 Story 拆分成「合适」大小的 Task,并且安排给