-
Notifications
You must be signed in to change notification settings - Fork 875
docs(guide): add dart version of structural directives #696
Changes from all commits
6fb1eac
7dc4360
72d8aa7
156e33a
cda3546
64d3995
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
// #docregion | ||
import 'package:angular2/angular2.dart'; | ||
import 'dart:async'; | ||
|
||
int nextId = 1; | ||
|
||
@Component( | ||
selector: 'heavy-loader', | ||
template: '<span>heavy loader #{{id}} on duty!</span>') | ||
class HeavyLoaderComponent implements OnInit, OnDestroy { | ||
int id = nextId++; | ||
@Input() List<String> logs; | ||
|
||
ngOnInit() { | ||
// Mock todo: get 10,000 rows of data from the server | ||
_log( | ||
"heavy-loader ${id} initialized, loading 10,000 rows of data from the server"); | ||
} | ||
|
||
ngOnDestroy() { | ||
// Mock todo: clean-up | ||
_log("heavy-loader ${id} destroyed, cleaning up"); | ||
} | ||
|
||
_log(String msg) { | ||
logs.add(msg); | ||
_tick(); | ||
} | ||
|
||
/// Triggers the next round of Angular change detection | ||
/// after one turn of the JavaScript cycle | ||
/// ensuring display of msg added in onDestroy | ||
_tick() { | ||
new Future(() {}); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Does this really have an effect, a no-op callback in a
(a comment in http://victorsavkin.com/post/110170125256/change-detection-in-angular-2) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @kwalrath could give you a better feedback on this. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That's just the Dart equivalent of the TS code, which I assume is just to kick the event loop. I have no real knowledge of how it works, and it's possible that without a return value it might be optimized away. @adaojunior: Does the app behave differently when you comment out this line? |
||
} | ||
} | ||
// #enddocregion |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
// #docplaster | ||
// #docregion | ||
import 'package:angular2/angular2.dart'; | ||
import 'package:structural_directives/unless_directive.dart'; | ||
import 'package:structural_directives/heavy_loader_component.dart'; | ||
|
||
@Component( | ||
selector: 'structural-directives', | ||
templateUrl: 'structural_directives_component.html', | ||
styles: const ['button { min-width: 100px; }'], | ||
directives: const [UnlessDirective, HeavyLoaderComponent]) | ||
class StructuralDirectivesComponent { | ||
List<String> heroes = ['Mr. Nice', 'Narco', 'Bombasto']; | ||
bool condition = true; | ||
bool isVisible = true; | ||
List<String> logs = []; | ||
String status = 'ready'; | ||
|
||
get hero => heroes[0]; | ||
} | ||
//#enddocregion |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
<!-- #docplaster --> | ||
<!-- #docregion --> | ||
<h1>Structural Directives</h1> | ||
|
||
<!-- #docregion structural-directives --> | ||
<!-- #docregion asterisk --> | ||
<div *ngIf="hero != null">{{hero}}</div> | ||
<div *ngFor="#hero of heroes">{{hero}}</div> | ||
<!-- #enddocregion asterisk --> | ||
<!-- #docregion ngSwitch --> | ||
<div [ngSwitch]="status"> | ||
<template [ngSwitchWhen]="'in-mission'">In Mission</template> | ||
<template [ngSwitchWhen]="'ready'">Ready</template> | ||
<template ngSwitchDefault>Unknown</template> | ||
</div> | ||
<!-- #enddocregion ngSwitch --> | ||
<!-- #enddocregion structural-directives --> | ||
|
||
<hr> | ||
|
||
<button | ||
(click)="condition = !condition" | ||
[style.background] = "condition ? 'orangered': 'lightgreen'" | ||
> | ||
Set 'condition' to {{condition ? 'False': 'True'}} | ||
</button> | ||
|
||
<!-- #docregion ngIf --> | ||
<p *ngIf="condition"> | ||
condition is true and ngIf is true. | ||
</p> | ||
<p *ngIf="!condition"> | ||
condition is false and ngIf is false. | ||
</p> | ||
<!-- #enddocregion ngIf --> | ||
<!-- #docregion myUnless--> | ||
<p *myUnless="condition"> | ||
condition is false and myUnless is true. | ||
</p> | ||
|
||
<p *myUnless="!condition"> | ||
condition is true and myUnless is false. | ||
</p> | ||
<!-- #enddocregion myUnless--> | ||
|
||
<hr> | ||
|
||
<!-- #docregion message-log --> | ||
<div><!-- Visibility --> | ||
<button (click)="isVisible = !isVisible">show | hide</button> | ||
<heavy-loader [style.display]="isVisible ? 'inline' : 'none'" [logs]="logs"></heavy-loader> | ||
</div> | ||
|
||
<div><!-- NgIf --> | ||
<button (click)="condition = !condition">if | !if</button> | ||
<heavy-loader *ngIf="condition" [logs]="logs"></heavy-loader> | ||
</div> | ||
|
||
<h4>heavy-loader log:</h4> | ||
<div *ngFor="#message of logs">{{message}}</div> | ||
<!-- #enddocregion message-log --> | ||
|
||
<hr> | ||
|
||
<!-- #docregion template-tag --> | ||
<p> | ||
Hip! | ||
</p> | ||
<template> | ||
<p> | ||
Hip! | ||
</p> | ||
</template> | ||
<p> | ||
Hooray! | ||
</p> | ||
<!-- #enddocregion template-tag --> | ||
|
||
<hr> | ||
|
||
<!-- #docregion ngIf-template --> | ||
<!-- Examples (A) and (B) are the same --> | ||
<!-- (A) *ngIf paragraph --> | ||
<p *ngIf="condition"> | ||
Our heroes are true! | ||
</p> | ||
|
||
<!-- (B) [ngIf] with template --> | ||
<template [ngIf]="condition"> | ||
<p> | ||
Our heroes are true! | ||
</p> | ||
</template> | ||
<!-- #enddocregion ngIf-template --> | ||
|
||
<hr> | ||
|
||
<!-- #docregion ngFor-template --> | ||
<!-- Examples (A) and (B) are the same --> | ||
|
||
<!-- (A) *ngFor div --> | ||
<div *ngFor="#hero of heroes">{{ hero }}</div> | ||
|
||
<!-- (B) ngFor with template --> | ||
<template ngFor #hero [ngForOf]="heroes"> | ||
<div>{{ hero }}</div> | ||
</template> | ||
<!-- #enddocregion ngFor-template --> | ||
<!-- #enddocregion --> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
// #docplaster | ||
// #docregion | ||
// #docregion unless-declaration | ||
import 'package:angular2/angular2.dart'; | ||
// #enddocregion unless-declaration | ||
|
||
// #docregion unless-declaration | ||
@Directive(selector: '[myUnless]') | ||
class UnlessDirective { | ||
// #enddocregion unless-declaration | ||
|
||
// #docregion unless-constructor | ||
TemplateRef _templateRef; | ||
ViewContainerRef _viewContainer; | ||
|
||
UnlessDirective(this._templateRef, this._viewContainer); | ||
// #enddocregion unless-constructor | ||
|
||
// #docregion unless-set | ||
@Input() | ||
set myUnless(bool condition) { | ||
if (!condition) { | ||
_viewContainer.createEmbeddedView(_templateRef); | ||
} else { | ||
_viewContainer.clear(); | ||
} | ||
} | ||
// #enddocregion unless-set | ||
// #docregion unless-declaration | ||
} | ||
// #enddocregion unless-declaration | ||
// #enddocregion |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
name: structural_directives | ||
description: Structural directives example | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Have you considered adding https://www.dartlang.org/tools/pub/pubspec.html#sdk-constraints? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @zoechi I had actually but all other examples dont set it. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There was a mention on another PR and the comments sounded that SDK constraint There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Just to confirm, we decided to add sdk and dart_to_js_script_rewriter to all pubspecs. |
||
version: 0.0.1 | ||
environment: | ||
sdk: '>=1.13.0 <2.0.0' | ||
dependencies: | ||
angular2: 2.0.0-beta.1 | ||
browser: ^0.10.0 | ||
dart_to_js_script_rewriter: ^0.1.0 | ||
transformers: | ||
- angular2: | ||
platform_directives: 'package:angular2/common.dart#COMMON_DIRECTIVES' | ||
entry_points: web/main.dart | ||
- dart_to_js_script_rewriter |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
<!DOCTYPE html> | ||
<!-- #docregion --> | ||
<html> | ||
|
||
<head> | ||
<title>Angular 2 Structural Directives</title> | ||
<script defer src="main.dart" type="application/dart"></script> | ||
<script defer src="packages/browser/dart.js"></script> | ||
</head> | ||
|
||
<body> | ||
<structural-directives>Loading...</structural-directives> | ||
</body> | ||
|
||
</html> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
// #docregion | ||
import 'package:angular2/bootstrap.dart'; | ||
import 'package:structural_directives/structural_directives_component.dart'; | ||
|
||
main() { | ||
bootstrap(StructuralDirectivesComponent); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I personally like it this way but the style guide says to omit
{}
when they are not required