{"id":181,"date":"2017-11-06T23:31:15","date_gmt":"2017-11-06T23:31:15","guid":{"rendered":"http:\/\/dart.honobono-life.info\/?p=181"},"modified":"2017-11-06T23:42:52","modified_gmt":"2017-11-06T23:42:52","slug":"angulardart-v4-router-restful","status":"publish","type":"post","link":"http:\/\/dart.honobono-life.info\/?p=181","title":{"rendered":"AngularDart v4 Router, RESTful"},"content":{"rendered":"AngularDart v4 Sample Code,Demo<br \/>\r\n<!--more-->\r\n<ul>\r\n<li>AngularDart : 4.0.0<\/li>\r\n<li>Dart : 1.24.1<\/li>\r\n<\/ul>\r\n<div role=\"tabpanel\">\r\n  <ul class=\"nav nav-tabs\">\r\n    <li class=\"active\"><a href=\"#demo1\" data-toggle=\"tab\">demo<\/a><\/li>\r\n    <li><a href=\"#html1\" data-toggle=\"tab\">markup<\/a><\/li>\r\n    <li><a href=\"#script1\" data-toggle=\"tab\">dart<\/a><\/li>\r\n  <\/ul>\r\n  <div class=\"tab-content\">\r\n    <div class=\"tab-pane active\" id=\"demo1\">\r\n<base href=\"http:\/\/dart.honobono-life.info\/?p=181\">\r\n<my-app>Loading&#8230;<\/my-app>\r\n\r\n    <\/div>\r\n    <div class=\"tab-pane\" id=\"html1\">\r\n\r\n<pre>\r\n(html)\r\n&lt;head>\r\n.....\r\n  &lt;base href=\"\/ngdart\/sample\/web\/\">\r\n  &lt;script defer src=\"main.dart\" type=\"application\/dart\">&lt;\/script>\r\n  &lt;script defer src=\"packages\/browser\/dart.js\">&lt;\/script>\r\n&lt;\/head>\r\n&lt;body>\r\n  &lt;my-app>Loading...&lt;\/my-app>\r\n&lt;\/body>\r\n\r\n(pubspec.yaml)\r\n.....\r\nenvironment:\r\n  sdk: '>=1.24.0 <2.0.0'\r\ndependencies:\r\n  angular: ^4.0.0\r\n  angular_forms: ^1.0.0\r\n  angular_router: ^1.0.2\r\n  http: ^0.11.0\r\n  stream_transform: ^0.0.6\r\n\r\ndev_dependencies:\r\n  angular_test: ^1.0.0\r\n  browser: ^0.10.0\r\n  dart_to_js_script_rewriter: ^1.0.1\r\n  mockito: ^2.0.2\r\n  test: ^0.12.21\r\n\r\ntransformers:\r\n- angular:\r\n    entry_points:\r\n    - web\/main.dart\r\n    - test\/**_test.dart\r\n- test\/pub_serve:\r\n    $include: test\/**_test.dart\r\n- dart_to_js_script_rewriter\r\n<\/pre>\r\n    <\/div>\r\n\r\n    <div class=\"tab-pane\" id=\"script1\">\r\n<pre>\r\n<strong>(main.dart)<\/strong>\r\nimport 'dart:async';\r\n\r\nimport 'package:angular\/angular.dart';\r\nimport 'package:angular_router\/angular_router.dart';\r\n\r\nimport 'package:http\/browser_client.dart';\r\n\r\nimport '.\/rest\/user-index.component.dart';\r\nimport '.\/rest\/user-new.component.dart';\r\nimport '.\/rest\/user-show.component.dart';\r\nimport '.\/rest\/user-edit.component.dart';\r\nimport '.\/rest\/user_service.dart';\r\n\r\n@Component(\r\n    selector: 'my-app',\r\n    template: '''\r\n      &lt;h1>{{title}}&lt;\/h1>\r\n      &lt;nav>\r\n        &lt;a [routerLink]=\"['Users']\">Users&lt;\/a>\r\n        &lt;a [routerLink]=\"['New']\">New&lt;\/a>\r\n      &lt;\/nav>\r\n      &lt;router-outlet>&lt;\/router-outlet>\r\n    ''',\r\n    directives: const [ROUTER_DIRECTIVES],\r\n    providers: const [UserService, ROUTER_PROVIDERS])\r\n@RouteConfig(const [\r\n  const Route(\r\n      path: 'new',\r\n      name: 'New',\r\n      component: UserNewComponent),\r\n  const Route(\r\n      path: '\/users',\r\n      name: 'Users',\r\n      component: UserIndexComponent),\r\n  const Route(\r\n      path: 'users\/:id',\r\n      name: 'Show',\r\n      component: UserShowComponent),\r\n  const Route(\r\n      path: 'users\/:id\/edit',\r\n      name: 'Edit',\r\n      component: UserEditComponent)\r\n])\r\nclass AppComponent {\r\n  String title = 'User Information';\r\n}\r\n\r\nvoid main() {\r\n  bootstrap(AppComponent, [provide(BrowserClient, useFactory: () => new BrowserClient(), deps: [])]\r\n  );\r\n}\r\n\r\n\r\n<strong>(user_service.dart)<\/strong>\r\nimport 'dart:async';\r\nimport 'dart:convert';\r\n\r\nimport 'package:angular\/angular.dart';\r\nimport 'package:http\/browser_client.dart';\r\n\r\nclass User {\r\n  int id;\r\n  String firstname;\r\n  String lastname;\r\n  String address;\r\n  String email;\r\n\r\n  User(this.id, this.firstname, this.lastname, this.address, this.email);\r\n  Map toJson() => {'id': id, 'firstname': firstname, 'lastname': lastname, 'address': address, 'email': email};\r\n}\r\n\r\n@Injectable()\r\nclass UserService {\r\n  String _url;\r\n  Map _headers;\r\n  BrowserClient _http;\r\n  UserService(this._http);\r\n\r\n  Future&lt;List&lt;User>> index() async {\r\n    _url = 'http:\/\/localhost\/ngdart\/ng4\/sample\/rest\/users';\r\n    try {\r\n      final response = await _http.get(_url);\r\n      final users = JSON.decode(response.body)\r\n          .map((value) => new User(value['id'], value['firstname'], value['lastname'], value['address'], value['email']))\r\n          .toList();\r\n      return users;\r\n    } catch (e) {\r\n      throw _handleError(e);\r\n    }\r\n  }\r\n\r\n  Future&lt;Map> create(Map data) async {\r\n    _url  = 'http:\/\/localhost\/ngdart\/ng4\/sample\/rest\/users';\r\n    _headers = {'Content-Type': 'application\/json'};\r\n    try {\r\n      final response = await _http.post(_url, headers: _headers, body: JSON.encode(data));\r\n      final user = JSON.decode(response.body);\r\n      return user;\r\n    } catch (e) {\r\n      throw _handleError(e);\r\n    }\r\n  }\r\n\r\n  Future&lt;Map> update(User data) async {\r\n    _url = 'http:\/\/localhost\/ngdart\/ng4\/sample\/rest\/users\/${data.id}';\r\n    _headers = {'Content-Type': 'application\/json'};\r\n    try {\r\n      final response = await _http.put(_url, headers: _headers, body: JSON.encode(data));\r\n      final user = JSON.decode(response.body);\r\n      return user;\r\n    } catch (e) {\r\n      throw _handleError(e);\r\n    }\r\n  }\r\n\r\n  Future&lt;User> show(int id) async {\r\n    _url = 'http:\/\/localhost\/ngdart\/ng4\/sample\/rest\/users\/' + id.toString();\r\n    try {\r\n      final response = await _http.get(_url);\r\n      Map res = JSON.decode(response.body);\r\n      User user = new User(res['id'], res['firstname'], res['lastname'], res['address'], res['email']);\r\n      return user;\r\n    } catch (e) {\r\n      throw _handleError(e);\r\n    }\r\n  }\r\n\r\n  Future&lt;Map> destroy(int id) async {\r\n    try {\r\n      _url = 'http:\/\/localhost\/ngdart\/ng4\/sample\/rest\/users\/$id';\r\n      _headers = {'Content-Type': 'application\/json'};\r\n      final response = await _http.delete(_url, headers: _headers);\r\n      final result = JSON.decode(response.body);\r\n      return result;\r\n    } catch (e) {\r\n      throw _handleError(e);\r\n    }\r\n  }\r\n\r\n  Exception _handleError(dynamic e) {\r\n    print(e); \/\/ for demo purposes only\r\n    return new Exception('Server error; cause: $e');\r\n  }\r\n}\r\n\r\n\r\n<strong>(user-index.component.dart)<\/strong>\r\nimport 'dart:async';\r\n\r\nimport 'package:angular\/angular.dart';\r\nimport 'package:angular_router\/angular_router.dart';\r\n\r\nimport 'user_service.dart';\r\n\r\n@Component(\r\n  selector: 'user-index',\r\n  template: '''\r\n&lt;table class=\"table table-striped table-bordered\">\r\n  &lt;thead>\r\n    &lt;tr>&lt;th>ID&lt;\/th>&lt;th>First Name&lt;\/th>&lt;th>Last name&lt;\/th>&lt;th>&lt;\/th>&lt;\/tr>\r\n  &lt;\/thead>\r\n  &lt;tbody>\r\n    &lt;tr *ngFor=\"let item of users\">\r\n      &lt;td>{{item.id}}&lt;\/td>\r\n      &lt;td>{{item.firstname}}&lt;\/td>\r\n      &lt;td>{{item.lastname}}&lt;\/td>\r\n      &lt;td>\r\n        &lt;button class=\"btn btn-primary\" (click)=\"show(item.id)\">Detail&lt;\/button>\r\n        &lt;button class=\"btn btn-primary\" (click)=\"destroy(item.id)\">Delete&lt;\/button>\r\n      &lt;\/td>\r\n    &lt;\/tr>\r\n  &lt;\/tbody>\r\n&lt;\/table>\r\n&lt;strong>Result&lt;\/strong>&lt;br \/>\r\n&lt;span>{{Result | json}}&lt;\/span>&lt;br \/>\r\n&lt;button class=\"btn btn-primary\" (click)=\"cancel()\">Back&lt;\/button>\r\n  ''',\r\n  directives: const [CORE_DIRECTIVES],\r\n  pipes: const [COMMON_PIPES]\r\n)\r\nclass UserIndexComponent implements OnInit {\r\n  List&lt;User> users;\r\n\r\n  final Router _router;\r\n  final UserService _userService;\r\n  Map Result;\r\n  UserIndexComponent(this._userService,this._router);\r\n\r\n  Future&lt;Null> index() async {\r\n    users = await _userService.index();\r\n  }\r\n  void ngOnInit() {\r\n    index();\r\n  }\r\n  void show(int id) {\r\n    _router.navigate(['Show', {'id': id.toString()}]);\r\n  }\r\n  Future&lt;Null> destroy(int id) async {\r\n    Result = await _userService.destroy(id);\r\n    Result['comment'] = \"User Index is not updated for demo.\";\r\n  }\r\n  void cancel() {\r\n    _router.navigate(['Users']);\r\n  }\r\n}\r\n\r\n\r\n<strong>(user-new.component.dart)<\/strong>\r\nimport 'dart:async';\r\n\r\nimport 'package:angular\/angular.dart';\r\nimport 'package:angular_router\/angular_router.dart';\r\n\r\nimport 'user_service.dart';\r\n\r\n@Component(\r\n  selector: 'user-new',\r\n  template: '''\r\n&lt;div class=\"panel panel-default\">\r\n  &lt;div class=\"panel-heading\">User Registration&lt;\/div>\r\n  &lt;div class=\"panel-body\">\r\n    &lt;span>Registration data&lt;\/span>&lt;br \/>\r\n    &lt;ul>\r\n      &lt;li>FirstName:{{new_data[\"firstname\"]}}&lt;\/li>\r\n      &lt;li>LastName:{{new_data[\"lastname\"]}}&lt;\/li>\r\n      &lt;li>Address:{{new_data[\"address\"]}}&lt;\/li>\r\n      &lt;li>Email:{{new_data[\"email\"]}}&lt;\/li>\r\n    &lt;\/ul>\r\n    &lt;button class=\"btn btn-primary\" (click)=\"create()\">Run&lt;\/button>\r\n    &lt;button class=\"btn btn-primary\" (click)=\"cancel()\">Back&lt;\/button>&lt;br \/>\r\n    &lt;strong>Result&lt;\/strong>&lt;br \/>\r\n    &lt;span>{{Result | json}}&lt;\/span>&lt;br \/>\r\n  &lt;\/div>\r\n&lt;\/div>\r\n  ''',\r\n  directives: const [CORE_DIRECTIVES],\r\n  pipes: const [COMMON_PIPES]\r\n)\r\nclass UserNewComponent {\r\n  final Router _router;\r\n  final UserService _userService;\r\n  Map new_data = {\r\n    \"firstname\": \"first4_new\",\r\n    \"lastname\": \"last4_new\",\r\n    \"address\": \"address4_new\",\r\n    \"email\": \"email4_new\",\r\n  };\r\n  Map Result;\r\n  UserNewComponent(this._userService,this._router);\r\n\r\n  Future&lt;Null> create() async {\r\n    Result = await _userService.create(new_data);\r\n  }\r\n  void cancel() {\r\n    _router.navigate(['Users']);\r\n  }\r\n}\r\n\r\n\r\n<strong>(user-show.component.dart)<\/strong>\r\nimport 'dart:async';\r\n\r\nimport 'package:angular\/angular.dart';\r\nimport 'package:angular_router\/angular_router.dart';\r\n\r\nimport 'user_service.dart';\r\n\r\n@Component(\r\n  selector: 'user-show',\r\n  template: '''\r\n&lt;div class=\"panel panel-default\">\r\n  &lt;div class=\"panel-heading\">User Detail&lt;\/div>\r\n  &lt;div class=\"panel-body\">\r\n    &lt;ul *ngIf=\"user != null\">\r\n      &lt;li>ID:{{user.id}}&lt;\/li>\r\n      &lt;li>FirstName:{{user.firstname}}&lt;\/li>\r\n      &lt;li>LastName:{{user.lastname}}&lt;\/li>\r\n      &lt;li>Address:{{user.address}}&lt;\/li>\r\n      &lt;li>Email:{{user.email}}&lt;\/li>\r\n    &lt;\/ul>\r\n    &lt;button class=\"btn btn-primary\" (click)=\"edit(user.id)\">Change&lt;\/button>\r\n    &lt;button class=\"btn btn-primary\" (click)=\"cancel()\">Back&lt;\/button>\r\n  &lt;\/div>\r\n&lt;\/div>\r\n  ''',\r\n  directives: const [CORE_DIRECTIVES],\r\n  pipes: const [COMMON_PIPES]\r\n)\r\nclass UserShowComponent implements OnInit {\r\n  User user;\r\n  final Router _router;\r\n  final RouteParams _routeParams;\r\n  final UserService _userService;\r\n\r\n  UserShowComponent(this._userService,this._router,this._routeParams);\r\n\r\n  Future&lt;Null> ngOnInit() async {\r\n    var _id = _routeParams.get('id');\r\n    var id = int.parse(_id ?? '', onError: (_) => null);\r\n    if (id != null) user = await (_userService.show(id));\r\n  }\r\n\r\n  void edit(int id) {\r\n    _router.navigate(['Edit', {'id': id.toString()}]);\r\n  }\r\n\r\n  void cancel() {\r\n    _router.navigate(['Users']);\r\n  }\r\n}\r\n\r\n\r\n<strong>(user-edit.component.dart)<\/strong>\r\nimport 'dart:async';\r\n\r\nimport 'package:angular\/angular.dart';\r\nimport 'package:angular_router\/angular_router.dart';\r\n\r\nimport 'user_service.dart';\r\n\r\n@Component(\r\n  selector: 'user-edit',\r\n  template: '''\r\n&lt;div class=\"panel panel-default\">\r\n  &lt;div class=\"panel-heading\">User Change&lt;\/div>\r\n  &lt;div class=\"panel-body\">\r\n    &lt;span>User Change Information&lt;\/span>&lt;br \/>\r\n    &lt;ul *ngIf=\"user != null\">\r\n      &lt;li>FirstName:{{user.firstname}}&lt;\/li>\r\n      &lt;li>LastName:{{user.lastname}}&lt;\/li>\r\n      &lt;li>Address:{{user.address}}&lt;\/li>\r\n      &lt;li>Email:{{user.email}}&lt;\/li>\r\n    &lt;\/ul>\r\n    &lt;button class=\"btn btn-primary\" (click)=\"update(user)\">Run&lt;\/button>\r\n    &lt;button class=\"btn btn-primary\" (click)=\"cancel()\">Back&lt;\/button>&lt;br \/>\r\n    &lt;strong>Result&lt;\/strong>&lt;br \/>\r\n    &lt;span>{{Result | json}}&lt;\/span>&lt;br \/>\r\n  &lt;\/div>\r\n&lt;\/div>\r\n  ''',\r\n  directives: const [CORE_DIRECTIVES],\r\n  pipes: const [COMMON_PIPES]\r\n)\r\nclass UserEditComponent implements OnInit {\r\n  User user;\r\n  final Router _router;\r\n  final RouteParams _routeParams;\r\n  final UserService _userService;\r\n  Map Result;\r\n  UserEditComponent(this._userService,this._router,this._routeParams);\r\n\r\n  Future&lt;Null> ngOnInit() async {\r\n    var _id = _routeParams.get('id');\r\n    var id = int.parse(_id ?? '', onError: (_) => null);\r\n    if (id != null) user = await (_userService.show(id));\r\n    user.firstname += \"_rev\";\r\n    user.lastname += \"_rev\";\r\n    user.address += \"_rev\";\r\n    user.email += \"_rev\";\r\n  }\r\n\r\n  Future&lt;Null> update(User data) async {\r\n    Result = await _userService.update(data);\r\n  }\r\n\r\n  void cancel() {\r\n    _router.navigate(['Users']);\r\n  }\r\n}\r\n<\/pre>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n<script type=\"text\/javascript\"  src='http:\/\/dart.honobono-life.info\/wp-content\/themes\/ang\/ngdart4\/rest.dart.js'><\/script>","protected":false},"excerpt":{"rendered":"<p>AngularDart v4 Sample Code,Demo<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/dart.honobono-life.info\/index.php?rest_route=\/wp\/v2\/posts\/181"}],"collection":[{"href":"http:\/\/dart.honobono-life.info\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/dart.honobono-life.info\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/dart.honobono-life.info\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/dart.honobono-life.info\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=181"}],"version-history":[{"count":4,"href":"http:\/\/dart.honobono-life.info\/index.php?rest_route=\/wp\/v2\/posts\/181\/revisions"}],"predecessor-version":[{"id":185,"href":"http:\/\/dart.honobono-life.info\/index.php?rest_route=\/wp\/v2\/posts\/181\/revisions\/185"}],"wp:attachment":[{"href":"http:\/\/dart.honobono-life.info\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=181"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/dart.honobono-life.info\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=181"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/dart.honobono-life.info\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}