Angular Dart 裡沒有 NgModule
,在官方文件裡提到的 Module
是指每一個 Component 的檔案,這可以從 main.dart
看出來
1 | import 'package:angular/angular.dart'; |
基本架構
基本 Angular Library 都是從 package:angular/angular.dart
來的,如果需要其他的功能,例如 Http ,則需要引用其他的 library。一個基本的 Component
會有 class 本體與 metadata 的部分,既有的 lifecyle hooks 依然存在,像是 OnInit、OnDestory 等。
1 | ( |
硬要說 Angular 與 AngularDart Component 的差異,應該是在 directives 與 providers 的部分,因為 AngularDart 版本並沒有 NgModule
這一個元素,所以服務的部分必須定義在 Component 這一個層級,同樣的內建的 directive
,像是 ngIf
、ngFor
等,都必須額外在 directives
的地方註冊,連使用到的 component
也必須被註冊。
Directive
如果需要使用到 NgClass
、NgFor
、NgIf
、NgTemplateOutlet
、NgStyle
、NgSwitch
、NgSwitchWhen
、NgSwitchDefault
的,需要加入 coreDirectives
至 directives 。
如果需要使用到 NgModel
時,需要加入 formDirectives
至 directives。並需加入 angular_forms: 2.1.1
套件
Dependency Injection
AngularDart 版本的 Dependency Injection,基本運作原理與 Angular 版本是一樣的,所以我們只需要將 AppComponent 視為 RootComponent(RootModule),任何 service 註冊在這一層的,都是 root level service,註冊 Service 的方式為
1 | ( |
對應到 Angular 的註冊方式
使用方式 | Angular | AngularDart |
---|---|---|
Class Provider | [Logger] | ClassProvider(Logger) |
Use-Class Provider | [{provide: Logger, useClass: BetterLogger}] | ClassProvider(Logger, useClass: BetterLogger) |
Exisiting Provider | [{provide, useExisting: BetterLogger}] | ExistingProvider(Logger, BetterLogger) |
Value Provider | [{ provide: Logger, useValue: silentLogger }] | ValueProvider(Logger, silentLogger) |
Factory Provider | { provide: HeroService,useFactory: heroServiceFactory, deps: [Logger, UserService]} | FactoryProvider(HeroService, heroServiceFactory) |
Token 使用法
使用方式 | Angular | AngularDart |
---|---|---|
Token | export const APP_CONFIG = new InjectionToken |
const appTitleToken = OpaqueToken |
註冊 | [{ provide: APP_CONFIG, useValue: 『app config content』}] | ValueProvider.forToken(appTitleToken, appTitle) |
取得 | constructor(@Inject(APP_CONFIG) config: AppConfig) { this.title = config.title; } | AppComponent(@Inject(appTitleToken) this.title); AppComponent(@appTitleToken this.title); |
範例程式
-
app_component.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25import 'package:angular/angular.dart';
import 'package:helloNgDart/app-detail.component.dart';
import './services/data.service.dart';
(
selector: 'my-app',
template: '''
<h1>Hello {{name}}</h1>
<app-detail></app-detail>
<hr/>
<div *ngFor="let item of list">
{{ item }}
</div>
''',
directives: [coreDirectives, AppDetailComponent],
providers: [ClassProvider(DataService)])
class AppComponent {
var name = 'Angular';
final DataService service;
var list;
AppComponent(this.service) {
this.list = this.service.list;
}
} -
app-detail.component.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25import 'package:angular/angular.dart';
import './services/data.service.dart';
import 'package:angular_forms/angular_forms.dart';
(
selector: 'app-detail',
template: '''
{{ name }}
<input [(ngModel)]="t" />
<button (click)="add()">Add</button>
''',
directives: [formDirectives],
)
class AppDetailComponent {
var name = "App Detail Component";
var t;
final DataService service;
AppDetailComponent(this.service);
add() {
this.service.add(this.t);
}
} -
services/data.service.dart
1
2
3
4
5
6
7
8class DataService {
var list = ['1', '2', '3'];
add(value) {
this.list.add(value);
}
} -
pubspec.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15name: helloNgDart
description: An absolute bare-bones web app.
environment:
sdk: '>=2.1.0 <3.0.0'
dependencies:
angular: ^5.0.0
angular_forms: 2.1.1
dev_dependencies:
build_runner: ^1.1.2
build_web_compilers: ^1.0.0
pedantic: ^1.0.0
結論
Angular Dart 的基本開發觀念是,每一個 Component 都是獨立個體,除了 provider 的部分,其餘的部分都需要各自設定,而這一部分是和 Angular (TS版) 有很大的差異性的