Dart Example

Just another WordPress site

AngularDart Demo

  • AngularDart : 1.1.0
  • Dart : 1.8.5
  • Bootstrap : 3.2.0
  • include file
  • dart.js

#INDEX
1. 2Way binding,ng-repeat,filter
2. ng-include, ng-switch
3. ng-if,ng-show,ng-hide
4. ng-class,ng-style
5. event
6. ng-disabled,ng-checked,ng-readonly,ng-select
7. form validation
8. select,option,radio
9. Built-in formatter
10. Built-in formatter by function
11. Custom formatter
12. Pagination
13. Service
14. Http service, Read from a JSON-encoded file
15. Http service, POST, Interceptor
16. Router, RESTful

1. 2Way binding,ng-repeat,filter




<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>AngularDart Sample</title>
    <script type="application/dart" src="main.dart"></script>
    <script type="text/javascript" src="packages/browser/dart.js"></script>

    <script src="packages/browser/dart.js"></script>
    <link rel="stylesheet" href="css/bootstrap.min.css">
    <link type="text/css" rel="stylesheet" href="css/style.css" />
</head>
<body>
  <div ng-cloak ng-app todo-controller>
    <h2>Todo List</h2>
    <ul>
      <li ng-repeat="todo in todos">
        <span>{{todo.text}}</span>
      </li>
    </ul>
    <h2>Todo Table</h2>
    Filter: <input type="text" ng-model="nameFilterString">
    <table class="table">
      <thead>
        <tr><th>No.</th><th>Action</th><th>Done</th></tr>
      </thead>
      <tbody>
        <tr ng-repeat="todo in todos | filter:{text:nameFilterString} | orderBy: 'text'" ng-class="$odd ? 'bg-success' : 'bg-warning'">
          <td>{{$index + 1}}</td>
          <td>{{todo.text}}</td>
          <td>{{todo.done}}</td>
        </tr>
      </tbody>
    </table>
  </div>
</body>
</html>

import 'package:angular/angular.dart';
import 'package:angular/application_factory.dart';

@Injectable()
class TodoController {
  List<Todo> todos;
  String nameFilterString = "";
  
  TodoController() {
    todos = [
      new Todo('learn AngularDart', false),
      new Todo('build an AngularDart App', false),
      new Todo('learn Dart', false),
      new Todo('learn JavaScript', true),
      new Todo('learn Google Maps', true),
      new Todo('learn AngularJS', true)
    ];
  } 
}
 
class Todo {
  String text;
  bool done;
 
  Todo(this.text, this.done);
}
 
class TodoModule extends Module {
  TodoModule() {
    bind(TodoController);
  }
}
 
main() {
  applicationFactory()
    .addModule(new TodoModule())
    .rootContextType(TodoController)
    .run();
}
(css)
[ng-cloak], [data-ng-cloak], .ng-cloak ,.ng-hide{
   display: none !important;
}
(pubspec.yaml)
dependencies:
  browser: '>=0.10.0+2 <0.11.0'
  web_components: ">=0.10.1 <0.11.0"
  angular: '>=1.1.0 <2.0.0'
  angular_ui: '>=0.6.4 <0.7.0'
transformers:
- angular

2. ng-include, ng-switch




<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>AngularDart Sample</title>
    <script type="application/dart" src="main.dart"></script>
    <script type="text/javascript" src="packages/browser/dart.js"></script>

    <script src="packages/browser/dart.js"></script>
    <link rel="stylesheet" href="css/bootstrap.min.css">
    <link type="text/css" rel="stylesheet" href="css/style.css" />
</head>
<body>
  <div ng-cloak ng-app todo-controller>
    ng-include(1)source is a string
    <div ng-include="view/include_table.html"></div>
    ng-include(2)source is a function
    <form>
      <input type="radio" ng-model="includeFile" value="list">List
      <input type="radio" ng-model="includeFile" value="table">Table
    </form>
    <div ng-include={{switchHtml()}}></div>
    <br />
    ng-switch
    <form>
      <input type="radio" ng-model="sw" value="list">List
      <input type="radio" ng-model="sw" value="table">Table
    </form>
    <div ng-switch="sw">
      <div ng-switch-when="table">
        <table class="table">
          <thead>
            <tr><th>No.</th><th>Action</th><th>Done</th></tr>
          </thead>
          <tbody>
            <tr ng-repeat="todo in todos" ng-class="$odd ? 'bg-success' : 'bg-wa
rning'">
              <td>{{$index + 1}}</td>
              <td>{{todo.text}}</td>
              <td>{{todo.done}}</td>
            </tr>
          </tbody>
        </table>
      </div>
      <div ng-switch-when="list">
        <ul>
          <li ng-repeat="todo in todos">{{todo.text}} ({{todo.done}})</li>
        </ul>
      </div>
      <div ng-switch-default>
        Select above option to display a layout
      </div>
    </div>
  </div>
</body>
</html>

import 'package:angular/angular.dart';
import 'package:angular/application_factory.dart';

@Injectable()
class TodoController {
  List<Todo> todos;
  String includeFile = "";
  
  TodoController() {
    todos = [
      new Todo('learn AngularDart', false),
      new Todo('build an AngularDart App', false),
      new Todo('learn Dart', false),
      new Todo('learn JavaScript', true),
      new Todo('learn Google Maps', true),
      new Todo('learn AngularJS', true)
    ];
  }
  String switchHtml() {
    if (includeFile == "list"){
      return "view/include_list.html";
    } else if (includeFile == "table"){
      return "view/include_table.html";
    }
  }
}
 
class Todo {
  String text;
  bool done;
 
  Todo(this.text, this.done);
}
 
class TodoModule extends Module {
  TodoModule() {
    bind(TodoController);
  }
}
 
main() {
  applicationFactory()
    .addModule(new TodoModule())
    .rootContextType(TodoController)
    .run();
}
(css)
[ng-cloak], [data-ng-cloak], .ng-cloak ,.ng-hide{
   display: none !important;
}

(pubspec.yaml)
dependencies:
  browser: '>=0.10.0+2 <0.11.0'
  web_components: ">=0.10.1 <0.11.0"
  angular: '>=1.1.0 <2.0.0'
  angular_ui: '>=0.6.4 <0.7.0'
transformers:
- angular:
    html_files:
    - web/view/include_table.html
    - web/view/include_list.html

(include_list.html)
<ul>
  <li ng-repeat="todo in todos">{{todo.text}} ({{todo.done}})</li>
</ul>

(include_table.html)
<table class="table">
  <thead>
    <tr><th>No.</th><th>Action</th><th>Done</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="todo in todos" ng-class="$odd ? 'bg-success' : 'bg-warning'">
      <td>{{$index + 1}}</td>
      <td>{{todo.text}}</td>
      <td>{{todo.done}}</td>
    </tr>
  </tbody>
</table>

3. ng-if,ng-show,ng-hide




<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>AngularDart Sample</title>
    <script type="application/dart" src="main.dart"></script>
    <script type="text/javascript" src="packages/browser/dart.js"></script>

    <script src="packages/browser/dart.js"></script>
    <link rel="stylesheet" href="css/bootstrap.min.css">
    <link type="text/css" rel="stylesheet" href="css/style.css" />
</head>
<body>
  <div ng-cloak ng-app member-controller>
    <strong>1.ng-if</strong>
    <div class="checkbox">
      <label>
        <input type="checkbox" ng-model="detail" />Detail
      </label>
    </div>
    <ul>
      <li ng-repeat="member in members">{{member.name}}
        <div ng-if="detail">
          <ul>
            <li>age:{{member.age}}</li>
            <li>address:{{member.address}}</li>
          </ul>
        </div>
      </li>
    </ul>
    <strong>2.ng-show</strong>
    <style>
      .detail > *:first-child {color: red}
    </style>
    <ul>
      <li ng-repeat="member in members">{{member.name}}
        <ul class="detail">
          <li ng-show="member.age_v">age:{{member.age}}</li>
          <li ng-show="member.address_v">address:{{member.address}}</li>
        </ul>
      </li>
    </ul>
  </div>
</body>
</html>

import 'package:angular/angular.dart';
import 'package:angular/application_factory.dart';

@Injectable()
class MemberController {
  List<Member> members;
  bool detail;
  
  MemberController() {
    members = [
      new Member('John',20,true,'1st Ave Seattle WA',false),
      new Member('Jessie',55,false,'2nd Ave Seattle WA',true),
      new Member('Peter',20,true,'Mercer St Seattle WA',true),
      new Member('Erika',37,false,'Alaskan Way Seattle WA',false)
    ];
  }
}
 
class Member {
  String name;
  int age;
  bool age_v;
  String address;
  bool address_v;
 
  Member(this.name,this.age,this.age_v,this.address,this.address_v);
}
 
class MemberModule extends Module {
  MemberModule() {
    bind(MemberController);
  }
}
 
main() {
  applicationFactory()
    .addModule(new MemberModule())
    .rootContextType(MemberController)
    .run();
}
(css)
[ng-cloak], [data-ng-cloak], .ng-cloak ,.ng-hide{
   display: none !important;
}

(pubspec.yaml)
dependencies:
  browser: '>=0.10.0+2 <0.11.0'
  web_components: ">=0.10.1 <0.11.0"
  angular: '>=1.1.0 <2.0.0'
  angular_ui: '>=0.6.4 <0.7.0'
transformers:
- angular

4. ng-class,ng-style




<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>AngularDart Sample</title>
    <script type="application/dart" src="main.dart"></script>
    <script type="text/javascript" src="packages/browser/dart.js"></script>

    <script src="packages/browser/dart.js"></script>
    <link rel="stylesheet" href="css/bootstrap.min.css">
    <link type="text/css" rel="stylesheet" href="css/style.css" />
</head>
<body>
  <div ng-cloak ng-app member-controller>

1.ng-class,ng-style
<div class="checkbox">
  <label>
    <input type="checkbox" ng-model="danger" />applay "bg-warning"class
  </label>
</div>
<ul ng-class="{'bg-warning': danger}">
  <li ng-repeat="member in members">{{member.name}}
    <ul>
      <li ng-style="{color:'red'}">age:{{member.age}}</li>
      <li ng-class="['bg-success','text-danger']">address:{{member.address}}</li>
    </ul>
  </li>
</ul>
2.ng-class-even,ng-class-odd
<style>
  tr.tbl-bg-clr-odd { background-color: lightpink; }
  tr.tbl-bg-clr-even { background-color: lightgreen;}
</style>
<table class="table">
  <thead>
    <tr><th>No.</th><th>name</th><th>age</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="member in members" ng-class-even="tblBgClr.even" ng-class-odd="tblBgClr.odd">
      <td>{{$index + 1}}</td>
      <td>{{member.name}}</td>
      <td>{{member.age}}</td>
    </tr>
  </tbody>
</table>

  </div>
</body>
</html>

import 'package:angular/angular.dart';
import 'package:angular/application_factory.dart';

@Injectable()
class MemberController {
  List<Member> members;
  bool danger;
  Map tblBgClr;
  
  MemberController() {
    members = [
      new Member('John',20,true,'1st Ave Seattle WA',false),
      new Member('Jessie',55,false,'2nd Ave Seattle WA',true),
      new Member('Peter',20,true,'Mercer St Seattle WA',true),
      new Member('Erika',37,false,'Alaskan Way Seattle WA',false)
    ];
    tblBgClr = {
      "odd": "tbl-bg-clr-odd",
      "even": "tbl-bg-clr-even"
    };
  }
}
 
class Member {
  String name;
  int age;
  bool age_v;
  String address;
  bool address_v;
 
  Member(this.name,this.age,this.age_v,this.address,this.address_v);
}
 
class MemberModule extends Module {
  MemberModule() {
    bind(MemberController);
  }
}
 
main() {
  applicationFactory()
    .addModule(new MemberModule())
    .rootContextType(MemberController)
    .run();
}
(css)
[ng-cloak], [data-ng-cloak], .ng-cloak ,.ng-hide{
   display: none !important;
}

(pubspec.yaml)
dependencies:
  browser: '>=0.10.0+2 <0.11.0'
  web_components: ">=0.10.1 <0.11.0"
  angular: '>=1.1.0 <2.0.0'
  angular_ui: '>=0.6.4 <0.7.0'
transformers:
- angular

5. event




<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>AngularDart Sample</title>
    <script type="application/dart" src="main.dart"></script>
    <script type="text/javascript" src="packages/browser/dart.js"></script>

    <script src="packages/browser/dart.js"></script>
    <link rel="stylesheet" href="css/bootstrap.min.css">
    <link type="text/css" rel="stylesheet" href="css/style.css" />
</head>
<body>
  <div ng-cloak ng-app member-controller>

  <p>Click,mouseenter,mouseleave event demo</p>
  <button class="btn" ng-class="btnColor1"
          ng-click="btnColor1='btn-success'"
          ng-mouseenter="btnColor1='btn-primary'"
          ng-mouseleave="btnColor1='btn-defult'"
  >
    Demo1
  </button>
  <button class="btn" ng-class="btnColor2"
          ng-click="handleEvent($event)"
          ng-mouseenter="handleEvent($event)"
          ng-mouseleave="handleEvent($event)"
  >
    Demo2
  </button>

  </div>
</body>
</html>

import 'package:angular/angular.dart';
import 'package:angular/application_factory.dart';

@Injectable()
class MemberController {
  String btnColor1;
  String btnColor2;
  void handleEvent(e) {
    switch (e.type){
      case "mouseover":
        btnColor2 = "btn-primary";
        break;
      case "mouseenter":
        btnColor2 = "btn-primary";
        break;
      case "click":
        btnColor2 = "btn-success";
        break;
      default:
        btnColor2 = "btn-default";
    }
  }
}
 
class MemberModule extends Module {
  MemberModule() {
    bind(MemberController);
  }
}
 
main() {
  applicationFactory()
    .addModule(new MemberModule())
    .rootContextType(MemberController)
    .run();
}
(css)
[ng-cloak], [data-ng-cloak], .ng-cloak ,.ng-hide{
   display: none !important;
}

(pubspec.yaml)
dependencies:
  browser: '>=0.10.0+2 <0.11.0'
  web_components: ">=0.10.1 <0.11.0"
  angular: '>=1.1.0 <2.0.0'
  angular_ui: '>=0.6.4 <0.7.0'
transformers:
- angular

6. ng-disabled,ng-checked,ng-readonly,ng-select




<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>AngularDart Sample</title>
    <script type="application/dart" src="main.dart"></script>
    <script type="text/javascript" src="packages/browser/dart.js"></script>

    <script src="packages/browser/dart.js"></script>
    <link rel="stylesheet" href="css/bootstrap.min.css">
    <link type="text/css" rel="stylesheet" href="css/style.css" />
</head>
<body>
  <div ng-cloak ng-app member-controller>

<input type="checkbox" ng-model="checkValue">Enable/Disable<br />
1)ng-disabled<br />
  <button class="btn btn-success" ng-disabled="checkValue">Button</button><br />
2)ng-checked<br />
  <input type="checkbox" ng-checked="checkValue">Checbox<br />
3)ng-readonly<br />
  <input type="text" ng-readonly="checkValue" value="ReadOnly"/><br />
4)ng-selected<br />
  <select>
    <option selected>Option1</option>
    <option>Option2</option>
    <option ng-selected="checkValue">Selected</option>
  </select>

  </div>
</body>
</html>

import 'package:angular/angular.dart';
import 'package:angular/application_factory.dart';

@Injectable()
class MemberController {
  bool checkValue;
}
 
class MemberModule extends Module {
  MemberModule() {
    bind(MemberController);
  }
}
 
main() {
  applicationFactory()
    .addModule(new MemberModule())
    .rootContextType(MemberController)
    .run();
}
(css)
[ng-cloak], [data-ng-cloak], .ng-cloak ,.ng-hide{
   display: none !important;
}

(pubspec.yaml)
dependencies:
  browser: '>=0.10.0+2 <0.11.0'
  web_components: ">=0.10.1 <0.11.0"
  angular: '>=1.1.0 <2.0.0'
  angular_ui: '>=0.6.4 <0.7.0'
transformers:
- angular

7. form validation




<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>AngularDart Sample</title>
    <script type="application/dart" src="main.dart"></script>
    <script type="text/javascript" src="packages/browser/dart.js"></script>

    <script src="packages/browser/dart.js"></script>
    <link rel="stylesheet" href="css/bootstrap.min.css">
    <link type="text/css" rel="stylesheet" href="css/style.css" />
</head>
<body>
  <div ng-cloak ng-app member-controller>

<style>
  form.ng-invalid.ng-dirty { background-color: lightpink; }
  form.ng-valid.ng-dirty { background-color: lightgreen; }
  form { padding: 10px;}
</style>
<form name="appForm" novalidate>
  <div class="well">
    <div class="form-group" ng-class="{'has-error': appForm['name'].invalid && appForm['name'].dirty}">
      <label>Member ID</label>
      <input type="text" name="name" class="form-control"
         ng-model="user.name" required
         ng-minlength="5" ng-maxlength="10"
         pattern="^[A-Z0-9]+$" />
      <span class="text-danger" ng-show="appForm['name'].dirty && appForm['name'].hasErrorState('ng-required')">This is a required field<br /></span>
      <span class="text-danger" ng-show="appForm['name'].dirty && appForm['name'].hasErrorState('ng-minlength')">Minimum length required is 5<br /></span>
      <span class="text-danger" ng-show="appForm['name'].dirty && appForm['name'].hasErrorState('ng-maxlength')">Max length required is 10<br /></span>
      <span class="text-danger" ng-show="appForm['name'].dirty && appForm['name'].hasErrorState('ng-pattern')">Only uppercase letter,digit<br /></span>
    </div>

    <div class="form-group" ng-class="{'has-error': appForm['email'].invalid && appForm['email'].dirty}">
      <label>Email</label>
      <input type="email" name="email" class="form-control"
        ng-model="user.email" required />
      <span class="text-danger" ng-show="appForm['email'].dirty && appForm['email'].hasErrorState('ng-required')">This is a required field<br /></span>
      <span class="text-danger" ng-show="appForm['email'].dirty && appForm['email'].hasErrorState('ng-email')">Enter a valid email address<br /></span>
    </div>
    <div class="text-center">
      <button ng-disabled="appForm.invalid" ng-click="save()" class="btn btn-primary">Submit
      </button>
    </div>
  </div>
</form>
<div class="well" ng-show="result">
  <strong>Check</strong><br />
  {{master|json}}
</div>

  </div>
</body>
</html>

import 'package:angular/angular.dart';
import 'package:angular/application_factory.dart';

@Injectable()
class MemberController {
  Map user;
  Map master;
  bool result = false;
  NgForm appForm;
  void save() {
    result = true;
    master = user; 
  }
}
 
class MemberModule extends Module {
  MemberModule() {
    bind(MemberController);
  }
}
 
main() {
  applicationFactory()
    .addModule(new MemberModule())
    .rootContextType(MemberController)
    .run();
}
(css)
[ng-cloak], [data-ng-cloak], .ng-cloak ,.ng-hide{
   display: none !important;
}

(pubspec.yaml)
dependencies:
  browser: '>=0.10.0+2 <0.11.0'
  web_components: ">=0.10.1 <0.11.0"
  angular: '>=1.1.0 <2.0.0'
  angular_ui: '>=0.6.4 <0.7.0'
transformers:
- angular

8. select,option,radio




<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>AngularDart Sample</title>
    <script type="application/dart" src="main.dart"></script>
    <script type="text/javascript" src="packages/browser/dart.js"></script>

    <script src="packages/browser/dart.js"></script>
    <link rel="stylesheet" href="css/bootstrap.min.css">
    <link type="text/css" rel="stylesheet" href="css/style.css" />
</head>
<body>
  <div ng-cloak ng-app member-controller>

<select ng-model="selectProduct1" placeholder="Select a Product">
  <option value="">Select a Product</option>
  <option ng-repeat="product in products" ng-value="product.id">{{product.name}}</option>
</select><br />
Selected value:{{selectProduct1}}<br />
<br />
<div class="radio" ng-repeat="product in products">
  <label>
    <input type="radio" ng-model="selectProduct2"
           value="{{product.id}}">{{product.name}}
  </label>
</div><br />
Selected value:{{selectProduct2}}<br />

  </div>
</body>
</html>

import 'package:angular/angular.dart';
import 'package:angular/application_factory.dart';

@Injectable()
class MemberController {
  List<Product> products;
  String selectProduct1;
  String selectProduct2;
  String selectProduct3;

  MemberController() {
    products = [
      new Product('0101', 'product1','Group-A'),
      new Product('0102', 'product2','Group-A'),
      new Product('0103', 'product3','Group-A'),
      new Product('0201', 'product4','Group-B'),
      new Product('0202', 'product5','Group-B')
    ];
  }
}
class Product {
  String id;
  String name;
  String grp;
 
  Product(this.id, this.name, this.grp);
}
 
class MemberModule extends Module {
  MemberModule() {
    bind(MemberController);
  }
}
 
main() {
  applicationFactory()
    .addModule(new MemberModule())
    .rootContextType(MemberController)
    .run();
}
(css)
[ng-cloak], [data-ng-cloak], .ng-cloak ,.ng-hide{
   display: none !important;
}

(pubspec.yaml)
dependencies:
  browser: '>=0.10.0+2 <0.11.0'
  web_components: ">=0.10.1 <0.11.0"
  angular: '>=1.1.0 <2.0.0'
  angular_ui: '>=0.6.4 <0.7.0'
transformers:
- angular

9. Built-in formatter




<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>AngularDart Sample</title>
    <script type="application/dart" src="main.dart"></script>
    <script type="text/javascript" src="packages/browser/dart.js"></script>

    <script src="packages/browser/dart.js"></script>
    <link rel="stylesheet" href="css/bootstrap.min.css">
    <link type="text/css" rel="stylesheet" href="css/style.css" />
</head>
<body>
  <div ng-cloak ng-app member-controller>

orderBy,limitTo,number<br />
<table class="table">
  <thead>
    <tr><th>Date</th><th>Test#1</th><th>Test#2</th><th>Test#3</th><th>Avarage</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="score in scores | orderBy: '-date' |limitTo:3">
      <td>{{score.date}}</td>
      <td>{{score.test1}}</td>
      <td>{{score.test2}}</td>
      <td>{{score.test3}}</td>
      <td>{{(score.test1 + score.test2 + score.test3)/3 | number:1}}</td>
    </tr>
  </tbody>
</table>

Filter(map),orderBy(list),<br />
Filter: <input type="text" ng-model="nameFilterString">
<table class="table">
  <thead>
    <tr><th>Name</th><th>Category</th><th>Price</th><th>Check</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in products |filter:{name: nameFilterString, chk: true} | orderBy:['category','price']">
      <td>{{item.name}}</td>
      <td>{{item.category}}</td>
      <td>{{item.price | currency}}</td>
      <td>{{item.chk}}</td>
    </tr>
  </tbody>
</table>

  </div>
</body>
</html>

import 'package:angular/angular.dart';
import 'package:angular/application_factory.dart';

@Injectable()
class MemberController {
  
  List<Score> scores;
  List<Product> products;
  String nameFilterString = "";
    
  MemberController() {
    scores = [
      new Score('2014/01/08', 74, 52, 68),
      new Score('2014/03/13', 54, 63, 38),
      new Score('2014/04/03', 36, 91, 75),
      new Score('2014/02/11', 71, 52, 48),
      new Score('2014/11/22', 48, 57, 28),
      new Score('2014/05/03', 94, 52, 78)
    ];
    products = [
      new Product('DeskTop #1', "DeskTop", 850, true),
      new Product('DeskTop #4', "DeskTop", 350, false),
      new Product('Laptop #2', "Laptop", 1590, true),
      new Product('DeskTop #2', "DeskTop", 980, true),
      new Product('Laptop #4', "Laptop", 590, false),
      new Product('Laptop #3', "Laptop", 2590, true),
      new Product('Laptop #1', "Laptop", 1490, true)
    ];
  } 
}
class Score {
  String date;
  int test1;
  int test2;
  int test3;
 
  Score(this.date, this.test1, this.test2, this.test3);
}

class Product {
  String name;
  String category;
  int price;
  bool chk;
 
  Product(this.name, this.category, this.price, this.chk);
}
class MemberModule extends Module {
  MemberModule() {
    bind(MemberController);
  }
}
 
main() {
  applicationFactory()
    .addModule(new MemberModule())
    .rootContextType(MemberController)
    .run();
}
(css)
[ng-cloak], [data-ng-cloak], .ng-cloak ,.ng-hide{
   display: none !important;
}

(pubspec.yaml)
dependencies:
  browser: '>=0.10.0+2 <0.11.0'
  web_components: ">=0.10.1 <0.11.0"
  angular: '>=1.1.0 <2.0.0'
  angular_ui: '>=0.6.4 <0.7.0'
transformers:
- angular

10. Built-in formatter by function




<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>AngularDart Sample</title>
    <script type="application/dart" src="main.dart"></script>
    <script type="text/javascript" src="packages/browser/dart.js"></script>

    <script src="packages/browser/dart.js"></script>
    <link rel="stylesheet" href="css/bootstrap.min.css">
    <link type="text/css" rel="stylesheet" href="css/style.css" />
</head>
<body>
  <div ng-cloak ng-app member-controller>

1.filter by function<br />

<table class="table">
  <thead>
    <tr><th>Date</th><th>Test#1</th><th>Test#2</th><th>Test#3</th><th>Avarage</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="score in scores | filter:selectPass">
      <td>{{score.date}}</td>
      <td>{{score.test1}}</td>
      <td>{{score.test2}}</td>
      <td>{{score.test3}}</td>
      <td>{{(score.test1 + score.test2 + score.test3)/3 | number:1}}</td>
    </tr>
  </tbody>
</table>
  <br />
2.orderBy expression<br />
 
[ <a href="" ng-click="sortClm='date'; reverse=false">back to init</a> ]
<table class="table">
  <thead>
    <tr>
      <th><a href="" ng-click="sortClm = 'date'; reverse=!reverse">Date</a></th>
      <th><a href="" ng-click="sortClm = 'test1'; reverse=!reverse">Test#1</a></th>
      <th><a href="" ng-click="sortClm = 'test2'; reverse=!reverse">Test#2</a></th>
      <th><a href="" ng-click="sortClm = 'test3'; reverse=!reverse">Test#3</a></th>
      <th>Total</th>
    </tr>
  </thead>
  <tbody>
    <tr ng-repeat="score in scores | orderBy:sortClm:reverse">
      <td>{{score.date}}</td>
      <td>{{score.test1}}</td>
      <td>{{score.test2}}</td>
      <td>{{score.test3}}</td>
      <td>{{score.test1 + score.test2 + score.test3}}</td>
    </tr>
  </tbody>
</table>
  <br />
3.orderBy function
  <table class="table"> <thead> <tr><th>Name</th><th>Price</th><th>Stock</th></tr> </thead> <tbody> <tr ng-repeat="item in products | orderBy:customOrder"> <td>{{item.name}}</td> <td>{{item.price | currency}}</td> <td>{{item.stock}}</td> </tr> </tbody> </table> </div> </body> </html>
import 'package:angular/angular.dart';
import 'package:angular/application_factory.dart';

@Injectable()
class MemberController {
  List<Score> scores;
  List<Product> products;
  String sortClm = 'date';
  bool reverse = false;
  
  MemberController() {
    scores = [
      new Score('2014/01/08', 74, 52, 68),
      new Score('2014/03/13', 54, 63, 38),
      new Score('2014/04/03', 36, 91, 75),
      new Score('2014/02/11', 71, 52, 48),
      new Score('2014/11/22', 48, 57, 28),
      new Score('2014/05/03', 94, 52, 78)
    ];
    products = [
      new Product('DeskTop #1', 850, 3),
      new Product('DeskTop #4', 350, 0),
      new Product('Laptop #2', 1590, 6),
      new Product('DeskTop #2', 980, 3),
      new Product('Laptop #4', 590, 0),
      new Product('Laptop #3', 2590, 1),
      new Product('Laptop #1', 1490, 10)
    ];
  }
  bool selectPass(item) {
    if ((item.test1 + item.test2 + item.test3) > 180 ) {
      return true;
    }
  }
  int customOrder(item) {
    return item.stock == 0 ? 99999 : item.price;
  }
}
class Score {
  String date;
  int test1;
  int test2;
  int test3;
 
  Score(this.date, this.test1, this.test2, this.test3);
}

class Product {
  String name;
  int price;
  int stock;
 
  Product(this.name, this.price, this.stock);
}
 
class MemberModule extends Module {
  MemberModule() {
    bind(MemberController);
  }
}
 
main() {
  applicationFactory()
    .addModule(new MemberModule())
    .rootContextType(MemberController)
    .run();
}
(css)
[ng-cloak], [data-ng-cloak], .ng-cloak ,.ng-hide{
   display: none !important;
}

(pubspec.yaml)
dependencies:
  browser: '>=0.10.0+2 <0.11.0'
  web_components: ">=0.10.1 <0.11.0"
  angular: '>=1.1.0 <2.0.0'
  angular_ui: '>=0.6.4 <0.7.0'
transformers:
- angular

11. Custom formatter




<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>AngularDart Sample</title>
    <script type="application/dart" src="main.dart"></script>
    <script type="text/javascript" src="packages/browser/dart.js"></script>

    <script src="packages/browser/dart.js"></script>
    <link rel="stylesheet" href="css/bootstrap.min.css">
    <link type="text/css" rel="stylesheet" href="css/style.css" />
</head>
<body>
  <div ng-cloak ng-app member-controller>

<table class="table">
  <thead>
    <tr><th>Name</th><th>Group</th><th>Price</th><th>Check</th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in products">
      <td>{{item.id}}</td>
      <td>{{item.name}}</td>
      <td>{{item.grp}}</td>
      <td>{{item.chk | checkmarkfilter}}</td>
    </tr>
  </tbody>
</table>

<select ng-model="selectProduct" placeholder="Select a Group">
  <option value="">Select a Group</option>
  <option ng-repeat="product in products | distinctfilter:'grp'" ng-value="product.grp">{{product.grp}}</option>
</select><br />
Selected value:{{selectProduct}}<br />

  </div>
</body>
</html>

(main.dart)
import 'package:angular/angular.dart';
import 'package:angular/application_factory.dart';
import 'package:WpDartExample/formatter/checkmark_filter.dart';
import 'package:WpDartExample/formatter/distinct_filter.dart';

@Injectable()
class MemberController {
  String selectProduct;
  List products = [
    {'id': '0101', 'name': 'product1', 'grp': 'Group-A', "chk": true},
    {'id': '0102', 'name': 'product2', 'grp': 'Group-A', "chk": true},
    {'id': '0103', 'name': 'product3', 'grp': 'Group-A', "chk": false},
    {'id': '0201', 'name': 'product4', 'grp': 'Group-B', "chk": true},
    {'id': '0202', 'name': 'product5', 'grp': 'Group-B', "chk": false}
  ];
  MemberController() {
  }
 
class MemberModule extends Module {
  MemberModule() {
    bind(MemberController);
    bind(CheckmarkFilter);
    bind(DistinctFilter);
  }
}

main() {
  applicationFactory()
    .addModule(new MemberModule())
    .rootContextType(MemberController)
    .run();
}

(checkmark_filter.dart)
library WpDartExample.checkmark_filter;

import 'package:angular/angular.dart';

@Formatter(name: 'checkmarkfilter')
class CheckmarkFilter {
  String call(input) {
    return input ? '\u2713' : '';
  }
}

(distinct_filter.dart)
library WpDartExample.distinct_filter;

import 'package:angular/angular.dart';

@Formatter(name: 'distinctfilter')
class DistinctFilter {
  List call(data, keyName) {
    if (data is Iterable && keyName is String) {
      List results = new List();
      Map keys = new Map();
      for (var i = 0; i < data.length; i++) {
        var val = data[i][keyName];
        if (keys[val] == null) {
          keys[val] = true;
          results.add(data[i]);
        }
      }
      return results;
    }
    return const [];
  }
}
(css)
[ng-cloak], [data-ng-cloak], .ng-cloak ,.ng-hide{
   display: none !important;
}

(pubspec.yaml)
dependencies:
  browser: '>=0.10.0+2 <0.11.0'
  web_components: ">=0.10.1 <0.11.0"
  angular: '>=1.1.0 <2.0.0'
  angular_ui: '>=0.6.4 <0.7.0'
transformers:
- angular

12. Pagination




<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>AngularDart Sample</title>
    <script type="application/dart" src="main.dart"></script>
    <script type="text/javascript" src="packages/browser/dart.js"></script>

    <script src="packages/browser/dart.js"></script>
    <link rel="stylesheet" href="css/bootstrap.min.css">
    <link type="text/css" rel="stylesheet" href="css/style.css" />
</head>
<body>
  <div ng-cloak ng-app member-controller>

<form class="form-inline">
  <div class="form-group">
    <label>Page Size:</label>
    <input ng-model="itemsPerPage" type="number"">
  </div>
</form>
<table class="table table-striped">
  <thead>
    <tr>
      <th>ID</th><th>Name</th><th>Group</th><th>Check</th>
    </tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in products | offsetfilter: (currentPage-1)*itemsPerPage | limitTo: itemsPerPage">
      <td>{{item.id}}</td>
      <td>{{item.name}}</td>
      <td>{{item.grp}}</td>
      <td>{{item.chk}}</td>
    </tr>
  </tbody>
  <tfoot>
    <td colspan="4">
      <ul class="pagination">
        <li ng-class="prevPageDisabled()">
          <a href="#" ng-click="prevPage()"><< Prev</a>
        </li>
        <li ng-repeat="n in range()"  ng-class="{active: n == currentPage}" ng-click="setPage(n)">
          <a href="#">{{n}}</a>
        </li>
        <li ng-class="nextPageDisabled()">
          <a href="#" ng-click="nextPage()">Next >></a>
        </li>
      </ul>
    </td>
  </tfoot>
</table>

  </div>
</body>
</html>

(main.dart)
import 'package:angular/angular.dart';
import 'package:angular/application_factory.dart';
import 'package:WpDartExample/formatter/checkmark_filter.dart';
import 'package:WpDartExample/formatter/distinct_filter.dart';

@Injectable()
class MemberController {
  int maxPage;
  int itemsPerPage = 3;
  int currentPage = 1;
  var pageRange = new List();
  List products = [
    {'id': '0101', 'name': 'product1', 'grp': 'Group-A', "chk": true},
    {'id': '0102', 'name': 'product2', 'grp': 'Group-A', "chk": true},
      :
  ];
  
  List range() {
    maxPage = (products.length/itemsPerPage).ceil();
    pageRange.clear();
    for (var i = 1; i <= maxPage; i++) {
      pageRange.add(i);
    }
    return pageRange;
  }

  void setPage(n) {
    currentPage = n;
  }
  
  void prevPage() {
    if (currentPage > 1) {
      currentPage--;
    }
  }
  
  void nextPage() {
    if (currentPage < maxPage) {
      currentPage++;
    }
  }
  
  String prevPageDisabled() {
    return currentPage == 1 ? "disabled" : "";
  }

  String nextPageDisabled() {
    return currentPage == maxPage ? "disabled" : "";
  }
  MemberController() {
  }
 
class MemberModule extends Module {
  MemberModule() {
    bind(MemberController);
    bind(CheckmarkFilter);
    bind(DistinctFilter);
  }
}

main() {
  applicationFactory()
    .addModule(new MemberModule())
    .rootContextType(MemberController)
    .run();
}

(offset_filter.dart)
library WpDartExample.offset_filter;

import 'package:angular/angular.dart';

@Formatter(name: 'offsetfilter')
class OffsetFilter {
  List call(data, start) {
    if (data is Iterable && start is int) {
      return data.sublist(start);
    }
    return const [];
  }
}
(css)
[ng-cloak], [data-ng-cloak], .ng-cloak ,.ng-hide{
   display: none !important;
}

(pubspec.yaml)
dependencies:
  browser: '>=0.10.0+2 <0.11.0'
  web_components: ">=0.10.1 <0.11.0"
  angular: '>=1.1.0 <2.0.0'
  angular_ui: '>=0.6.4 <0.7.0'
transformers:
- angular

13. Service




(main_demo.html)
<button ng-click="open('Component-A')">Component-A</button>
<button ng-click="open('Component-B')">Component-B</button>
<div ng-switch="tab">
  <div ng-switch-when="Component-A">
    <strong>Component-A</strong>
    <log-demo msg="'This is Componetnt-A'"></log-demo>
  </div>
  <div ng-switch-when="Component-B">
    <strong>Component-B</strong>
    <log-demo msg="'This is Componetnt-B'"></log-demo>
  </div>
</div>

(log_demo.html)
<ul>
  <li ng-repeat="item in logs">
    {{item.id}}=>{{item.msg}}
  </li>
</ul>
<button ng-click="add_s()">Write a log</button>

(main.dart)
library WpDartExample;
import 'dart:html';
import 'package:angular/angular.dart';
import 'package:angular/application_factory.dart';

import 'package:WpDartExample/services/log_service.dart';
import 'package:WpDartExample/component/main_demo.dart';
import 'package:WpDartExample/component/log_demo.dart';

class MyAppModule extends Module {
  MyAppModule() {
    bind(LogService);
    bind(MainDemoComponent);
    bind(LogDemoComponent);
  }
}
void main() {
  applicationFactory()
      .addModule(new MyAppModule())
      .run();
}

(log_service.dart)
library WpDartExample.log_service;

import 'package:angular/angular.dart';

@Injectable()
class LogService {
  List<Map> logs;
  int LogCount;
  LogService() {
    logs = new List();
    LogCount = 0;
  } 
  List add(msg) {
    Map log = new Map();
    log["id"] = ++LogCount;
    log["msg"] = msg;
    logs.add(log);
    return logs;
  }
}

(main_demo.dart)
library WpDartExample.main;

import 'package:angular/angular.dart';

@Component(
  selector: 'main-demo',
  templateUrl: 'main_demo.html',
  useShadowDom: false)
class MainDemoComponent {
  String tab = "Component-A";
  void open(input) {
    tab = input;
  }
}

(log_demo.dart)
library WpDartExample.log;

import 'package:angular/angular.dart';
import 'package:WpDartExample/services/log_service.dart';

@Component(
  selector: 'log-demo',
  templateUrl: 'log_demo.html',
  useShadowDom: false)
  class LogDemoComponent {
  @NgTwoWay('msg')
  String msg;

  LogService ls;
  List<Map> logs = new List();
    
  LogDemoComponent(this.ls) {
  }

  void add_s() {
    logs = ls.add(msg);
  }
}

(css)
[ng-cloak], [data-ng-cloak], .ng-cloak ,.ng-hide{
   display: none !important;
}

(pubspec.yaml)
dependencies:
  browser: '>=0.10.0+2 <0.11.0'
  web_components: ">=0.10.1 <0.11.0"
  angular: '>=1.1.0 <2.0.0'
  angular_ui: '>=0.6.8 <0.7.0'
transformers:
- angular:
    html_files:
      - lib/component/main_demo.html
      - lib/component/log_demo.html

14. Http service, Read from a JSON-encoded file




(httpjson_demo.html)
<button ng-click="getFriends(true)">Success</button>
 <button ng-click="getFriends(false)">Error</button><br />
<strong>Response Status,Header</strong><br />
<textarea class="form-control" rows="5">{{getFriendsResult}}</textarea>
<strong>Response Data</strong><br />
    <table class="table table-striped">
  <thead>
    <tr>
      <th>No</th><th>Name</th><th>Age</th><th>Address</th>
    </tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in friends" >
      <td>{{item.id}}</td><td>{{item.name}}</td><td>{{item.age}}</td><td>{{item.address}}</td>
    </tr>
  </tbody>
</table>

(main.dart)
library WpDartExample;
import 'dart:html';
import 'package:angular/angular.dart';
import 'package:angular/application_factory.dart';

import 'package:WpDartExample/services/httpjson_demo.dart';

class MyAppModule extends Module {
  MyAppModule() {
    bind(HttpjsonDemoComponent);
  }
}
void main() {
  applicationFactory()
      .addModule(new MyAppModule())
      .run();
}

(httpjson_demo.dart)
library WpDartExample.httpjson;

import 'package:angular/angular.dart';
import 'dart:async' show Future;

@Component(
  selector: 'httpjson-demo',
  templateUrl: 'httpjson_demo.html',
  useShadowDom: false)
class HttpjsonDemoComponent {
  final Http _http;
  List<Map> friends = [];
  String svrURL;
  String getFriendsResult;
  HttpjsonDemoComponent(this._http) {
  }
  
  Future getFriends(bool tf) {
    svrURL = tf ? "friends.json" : "invalid-url";
    return _http.get(svrURL)
              .then((HttpResponse response) {
                friends = response.data;
                getFriendsResult = "status: " + response.status.toString() + "\n" +
                                   "headers: " + response.config.headers.toString();
              })
              .catchError((e) {
                friends = [];
                getFriendsResult = "status: " + e.status.toString() + "\n" +
                                   "contents: " + e.data;
              });
  }
}

(css)
[ng-cloak], [data-ng-cloak], .ng-cloak ,.ng-hide{
   display: none !important;
}

(pubspec.yaml)
dependencies:
  browser: '>=0.10.0+2 <0.11.0'
  web_components: ">=0.10.1 <0.11.0"
  angular: '>=1.1.0 <2.0.0'
  angular_ui: '>=0.6.8 <0.7.0'
transformers:
- angular:
    html_files:
      - lib/component/httpjson_demo.html

15. Http service, POST, Interceptor




(httppost_demo.html)
<span>Sending Data</span><br />
<span>{{send_data}}</span><br />
<strong>1.AngularJS Default(json)</strong><br />
<button ng-click="postCall(false)">Send</button><br />
<strong>2.Using Interceptor(x-www-form-urlencoded)</strong><br />
<button ng-click="postCall(true)">Send</button><br />
<textarea class="form-control" rows="3">{{postCallResult}}</textarea>

(main.dart)
library WpDartExample;
import 'dart:html';
import 'package:angular/angular.dart';
import 'package:angular/application_factory.dart';

import 'package:WpDartExample/services/httppost_demo.dart';

class MyAppModule extends Module {
  MyAppModule() {
    bind(HttppostDemoComponent);
  }
}
void main() {
  applicationFactory()
      .addModule(new MyAppModule())
      .run();
}

(httppost_demo.dart)
library WpDartExample.httppost;

import 'package:angular/angular.dart';
import 'dart:async' show Future;

@Component(
  selector: 'httppost-demo',
  templateUrl: 'httppost_demo.html',
//  exportExpressions: const ['friends'],
  useShadowDom: false)
class HttppostDemoComponent {
  final Http _http;
  Map send_data = {
                    "id": "0101",
                    "name": "Tom"
                  };
  String svrURL = "http_server.php";
  String postCallResult;
  Map headers = { 'Content-Type': 'application/x-www-form-urlencoded' };
  HttpInterceptor intercept;
  HttpResponseConfig transRequest(HttpResponseConfig config) {
    String transStr = "";
    if (config.data != null) {
      config.data.forEach((k, v) {
        if (transStr.isNotEmpty) {
          transStr += '&' + k + '=' + v;
        } else {
          transStr = k + '=' + v;
        }
      });
    }
    config.data = transStr;
    return config;
  }

  HttppostDemoComponent(this._http) {
    RequestInterceptor reqint = transRequest;
    intercept = new HttpInterceptor();
    intercept.request = reqint;
  }
  
  Future postCall(bool tf) {
    if(!tf) {
      return _http.post(svrURL,send_data)
                .then((HttpResponse response) {
                  postCallResult = "status: " + response.status.toString() + "\n" +
                                     "Sending Data: " + response.data + "\n" +
                                     "headers: " + response.config.headers.toString();
                })
                .catchError((e) {
                  postCallResult = "status: " + e.status.toString() + "\n" +
                                     "contents: " + e.data;
                });
    } else {
      return _http.post(svrURL,send_data,headers:headers,interceptors:intercept)
                .then((HttpResponse response) {
                  postCallResult = "status: " + response.status.toString() + "\n" +
                                     "Sending Data: " + response.data + "\n" +
                                     "headers: " + response.config.headers.toString();
                })
                .catchError((e) {
                  postCallResult = "status: " + e.status.toString() + "\n" +
                                     "contents: " + e.data;
                });
    };
  }
}

(css)
[ng-cloak], [data-ng-cloak], .ng-cloak ,.ng-hide{
   display: none !important;
}

(pubspec.yaml)
dependencies:
  browser: '>=0.10.0+2 <0.11.0'
  web_components: ">=0.10.1 <0.11.0"
  angular: '>=1.1.0 <2.0.0'
  angular_ui: '>=0.6.8 <0.7.0'
transformers:
- angular:
    html_files:
      - lib/component/httppost_demo.html

16. Router, RESTful




(users_demo.html)
<a class="btn btn-primary" href="#/users/main" role="button">To REST APP</a><br />
<ng-view></ng-view><br />

(view/user_main.html)
<a class="btn btn-primary" href="#/users/new">User Create</a>
<a class="btn btn-primary" href="#/users">User Index</a>

(component/user_index.html)
<table class="table table-striped table-bordered">
  <thead>
    <tr><th>ID</th><th>First Name</th><th>Last name</th><th></th></tr>
  </thead>
  <tbody>
    <tr ng-repeat="item in users">
      <td>{{item.id}}</td>
      <td>{{item.firstName}}</td>
      <td>{{item.lastName}}</td>
      <td>
        <a class="btn btn-primary" href="#/users/{{item.id}}" role="button">Detail</a>
        <button class="btn btn-primary" ng-click="destroy(item.id)">Delete</button>
      </td>
    </tr>
  </tbody>
</table>
<strong>Reuslt</strong><br />
<span>{{Result}}</span><br />
<a class="btn btn-primary" href="#/users/main" role="button">Back</a>

(component/user_show.html)
<div class="panel panel-default">
  <div class="panel-heading">User Detail</div>
  <div class="panel-body">
    <ul>
      <li>ID:{{user.id}}</li>
      <li>FirstName:{{user.firstName}}</li>
      <li>LastName:{{user.lastName}}</li>
      <li>Address:{{user.address}}</li>
      <li>Age:{{user.age}}</li>
    </ul>
    <a class="btn btn-primary" href="#/users/{{user.id}}/edit" role="button">User Edit</a>
    <a class="btn btn-primary" href="#/users/main" role="button">Back</a><br />
  </div>
</div>

(component/user_new.html)
<div class="panel panel-default">
  <div class="panel-heading">User Create</div>
  <div class="panel-body">
    <span>New User Info</span><br />
    <ul>
      <li>FirstName:{{new_data.firstName}}</li>
      <li>LastName:{{new_data.lastName}}</li>
      <li>Address:{{new_data.address}}</li>
      <li>Age:{{new_data.age}}</li>
    </ul>
    <button class="btn btn-primary" ng-click="create()">Create</button>
    <a class="btn btn-primary" href="#/users/main" role="button">Back</a><br />
    <strong>Result</strong><br />
    <span>{{Result}}</span><br />
  </div>
</div>

(component/user_edit.html)
<div class="panel panel-default">
  <div class="panel-heading">User Edit</div>
  <div class="panel-body">
    <span>User Edit info</span><br />
    <ul>
      <li>FirstName:{{user.firstName}}</li>
      <li>LastName:{{user.lastName}}</li>
      <li>Address:{{user.address}}</li>
      <li>Age:{{user.age}}</li>
    </ul>
    <button class="btn btn-primary" ng-click="update(user)">Update</button>
    <a class="btn btn-primary" href="#/users/main" role="button">Back</a><br />
    <strong>Result</strong><br />
    <span>{{Result}}</span><br />
  </div>
</div>

(main.dart)
library WpDartExample;
import 'dart:html';
import 'package:angular/angular.dart';
import 'package:angular/application_factory.dart';

import 'package:WpDartExample/component/users_demo.dart';
import 'package:WpDartExample/component/userindex_demo.dart';
import 'package:WpDartExample/component/usershow_demo.dart';
import 'package:WpDartExample/component/useredit_demo.dart';
import 'package:WpDartExample/component/usernew_demo.dart';
import 'package:WpDartExample/routing/router_demo.dart';

class MyAppModule extends Module {
  MyAppModule() {
    bind(UsersDemoComponent);
    bind(UserindexDemoComponent);
    bind(UsershowDemoComponent);
    bind(UsereditDemoComponent);
    bind(UsernewDemoComponent);
    bind(RouteInitializerFn, toValue: RouterDemoInitializer);
    bind(NgRoutingUsePushState, toValue: new NgRoutingUsePushState.value(false));
  }
}
void main() {
  applicationFactory()
      .addModule(new MyAppModule())
      .run();
}

(router_demo.dart)
library WpDartExample.router;

import 'package:angular/angular.dart';

void RouterDemoInitializer(Router router, RouteViewFactory views) {
  views.configure({
    'users': ngRoute(
      path: '/users',
      viewHtml: '<userindex-demo></userindex-demo>'),
    'main': ngRoute(
      path: '/users/main',
      view: 'view/user_main.html'),
    'new': ngRoute(
      path: '/users/new',
      viewHtml: '<usernew-demo></usernew-demo>'),
    'show': ngRoute(
      path: '/users/:id',
      viewHtml: '<usershow-demo></usershow-demo>'),
    'edit': ngRoute(
      path: '/users/:id/edit',
      viewHtml: '<useredit-demo></useredit-demo>'),
//    'users_default': ngRoute(
//      defaultRoute: true,
//      enter: (RouteEnterEvent e) =>
//                router.go('main', {},
//                  replace: true)
//      )
  });
}

(users_demo.dart)
library WpDartExample.users;

import 'package:angular/angular.dart';

@Component(
  selector: 'users-demo',
  templateUrl: 'users_demo.html',
  useShadowDom: false)
class UsersDemoComponent {
}

(userindex_demo.dart)
library WpDartExample.userindex;

import 'package:angular/angular.dart';

@Component(
  selector: 'userindex-demo',
  templateUrl: 'userindex_demo.html',
  useShadowDom: false)
class UserindexDemoComponent {
  final Http _http;
  List<Map> users = [];
  String svrURL;
  String Result;
  UserindexDemoComponent(this._http) {
    _getusers();
  }
  
  void _getusers() {
    svrURL = "/rest/users/";
    _http.get(svrURL)
      .then((HttpResponse response) {
        users = response.data;
        Result = "status: " + response.status.toString() + "\n" +
                 "headers: " + response.config.headers.toString();
      })
      .catchError((e) {
        users = [];
        Result = "status: " + e.status.toString() + "\n" +
                 "contents: " + e.data;
      });
  }
  void destroy(id) {
    svrURL = "/rest/users/" + id.toString();
    _http.delete(svrURL)
      .then((HttpResponse response) {
        Result = "User(id: " + id.toString() + ")Delete Complete.Index is not updated because of a test purpose";
      })
      .catchError((e) {
        users = [];
        Result = "status: " + e.status.toString() + "\n" +
                 "contents: " + e.data;
      });
  }
}

(usershow_demo.dart)
library WpDartExample.usershow;

import 'package:angular/angular.dart';

@Component(
  selector: 'usershow-demo',
  templateUrl: 'usershow_demo.html',
  useShadowDom: false)
class UsershowDemoComponent {
  final Http _http;
  Map user = {};
  String _id;
  String svrURL;
  String Result;
  UsershowDemoComponent(this._http,RouteProvider routeProvider) {
    _id = routeProvider.parameters['id'];
    _getuser(_id);
  }
  
  void _getuser(id) {
    svrURL = "/rest/users/" + id ;
    _http.get(svrURL)
      .then((HttpResponse response) {
        user = response.data;
        Result = "status: " + response.status.toString() + "\n" +
                 "headers: " + response.config.headers.toString();
      })
      .catchError((e) {
        user = {};
        Result = "status: " + e.status.toString() + "\n" +
                 "contents: " + e.data;
      });
  }
}

(usernew_demo.dart)
library WpDartExample.usernew;

import 'package:angular/angular.dart';
import 'dart:async' show Future;

@Component(
  selector: 'usernew-demo',
  templateUrl: 'usernew_demo.html',
  useShadowDom: false)
class UsernewDemoComponent {
  final Http _http;
  Map new_data = {
    "firstName": "first4_new",
    "lastName": "last4_new",
    "address": "address4_new",
    "age": "age4_new"
  };
  String svrURL;
  String Result;
  UsernewDemoComponent(this._http) {
  }
  
  Future create() {
    svrURL = "/rest/users/";
    return _http.post(svrURL,new_data)
             .then((HttpResponse response) {
               Result = "User Create Complete.";
             })
             .catchError((e) {
               Result = "status: " + e.status.toString() + "\n" +
                                "contents: " + e.data;
             });
  }
}

(useredit_demo.dart)
library WpDartExample.useredit;

import 'package:angular/angular.dart';
import 'dart:async' show Future;

@Component(
  selector: 'useredit-demo',
  templateUrl: 'useredit_demo.html',
  useShadowDom: false)
class UsereditDemoComponent {
  final Http _http;
  Map user = {};
  String _id;
  String svrURL;
  String Result;
  UsereditDemoComponent(this._http,RouteProvider routeProvider) {
    _id = routeProvider.parameters['id'];
    _getuser(_id);
  }
  
  void _getuser(id) {
    svrURL = "/rest/users/" + id ;
    _http.get(svrURL)
      .then((HttpResponse response) {
        user = response.data;
        user["firstName"] += "_rev";
        user["lastName"] += "_rev";
        user["address"] += "_rev";
        user["age"] += "_rev";
      })
      .catchError((e) {
        user = {};
        Result = "status: " + e.status.toString() + "\n" +
                 "contents: " + e.data;
      });
  }
  Future update(user) {
    svrURL = "/rest/users/" + _id;
    return _http.put(svrURL,user)
             .then((HttpResponse response) {
               Result = "User(id: " + _id + ")Update Complete.";
             })
             .catchError((e) {
               Result = "status: " + e.status.toString() + "\n" +
                                "contents: " + e.data;
             });
  }
}
(css)
[ng-cloak], [data-ng-cloak], .ng-cloak ,.ng-hide{
   display: none !important;
}

(pubspec.yaml)
dependencies:
  browser: '>=0.10.0+2 <0.11.0'
  web_components: ">=0.10.1 <0.11.0"
  angular: '>=1.1.0 <2.0.0'
  angular_ui: '>=0.6.8 <0.7.0'
transformers:
- angular:
    html_files:
      - lib/component/users_demo.html
      - lib/component/userindex_demo.html
      - lib/component/usershow_demo.html
      - lib/component/useredit_demo.html
      - lib/component/usernew_demo.html