| OLD | NEW |
| 1 library todo; | 1 library todo; |
| 2 | 2 |
| 3 import 'package:angular/angular.dart'; | 3 import 'package:angular/angular.dart'; |
| 4 | 4 |
| 5 | 5 |
| 6 class Item { | 6 class Item { |
| 7 String text; | 7 String text; |
| 8 bool done; | 8 bool done; |
| 9 | 9 |
| 10 Item([String this.text = '', bool this.done = false]); | 10 Item([this.text = '', this.done = false]); |
| 11 | 11 |
| 12 bool get isEmpty => text.isEmpty; | 12 bool get isEmpty => text.isEmpty; |
| 13 | 13 |
| 14 clone() => new Item(text, done); | 14 Item clone() => new Item(text, done); |
| 15 | 15 |
| 16 clear() { | 16 void clear() { |
| 17 text = ''; | 17 text = ''; |
| 18 done = false; | 18 done = false; |
| 19 } | 19 } |
| 20 } | 20 } |
| 21 | 21 |
| 22 // In 'server mode', this class fetches items from the server. | |
| 23 class ServerController { | |
| 24 Http _http; | |
| 25 | 22 |
| 26 ServerController(Http this._http); | 23 // ServerController interface. Logic in main.dart determines which |
| 24 // implementation we should use. |
| 25 abstract class ServerController { |
| 26 init(TodoController todo); |
| 27 } |
| 28 |
| 29 |
| 30 // An implementation of ServerController that does nothing. |
| 31 class NoServerController implements ServerController { |
| 32 init(TodoController todo) { } |
| 33 } |
| 34 |
| 35 |
| 36 // An implementation of ServerController that fetches items from |
| 37 // the server over HTTP. |
| 38 class HttpServerController implements ServerController { |
| 39 final Http _http; |
| 40 HttpServerController(this._http); |
| 27 | 41 |
| 28 init(TodoController todo) { | 42 init(TodoController todo) { |
| 29 _http(method: 'GET', url: '/todos').then((HttpResponse data) { | 43 _http(method: 'GET', url: '/todos').then((HttpResponse data) { |
| 30 data.data.forEach((d) { | 44 data.data.forEach((d) { |
| 31 todo.items.add(new Item(d["text"], d["done"])); | 45 todo.items.add(new Item(d["text"], d["done"])); |
| 32 }); | 46 }); |
| 33 }); | 47 }); |
| 34 } | 48 } |
| 35 } | 49 } |
| 36 | 50 |
| 37 // An implementation of ServerController that does nothing. | |
| 38 // Logic in main.dart determines which implementation we should | |
| 39 // use. | |
| 40 class NoServerController implements ServerController { | |
| 41 init(TodoController todo) { } | |
| 42 } | |
| 43 | 51 |
| 44 | 52 @NgController( |
| 45 @NgDirective( | 53 selector: '[todo-controller]', |
| 46 selector: '[todo-controller]', | 54 publishAs: 'todo') |
| 47 publishAs: 'todo' | |
| 48 ) | |
| 49 class TodoController { | 55 class TodoController { |
| 50 List<Item> items; | 56 var items = <Item>[]; |
| 51 Item newItem; | 57 Item newItem; |
| 52 | 58 |
| 53 TodoController(ServerController serverController) { | 59 TodoController(ServerController serverController) { |
| 54 newItem = new Item(); | 60 newItem = new Item(); |
| 55 items = [ | 61 items = [ |
| 56 new Item('Write Angular in Dart', true), | 62 new Item('Write Angular in Dart', true), |
| 57 new Item('Write Dart in Angular'), | 63 new Item('Write Dart in Angular'), |
| 58 new Item('Do something useful') | 64 new Item('Do something useful') |
| 59 ]; | 65 ]; |
| 60 | 66 |
| 61 serverController.init(this); | 67 serverController.init(this); |
| 62 } | 68 } |
| 63 | 69 |
| 64 // workaround for https://github.com/angular/angular.dart/issues/37 | 70 // workaround for https://github.com/angular/angular.dart/issues/37 |
| 65 dynamic operator [](String key) { | 71 dynamic operator [](String key) => key == 'newItem' ? newItem : null; |
| 66 if (key == 'newItem') { | |
| 67 return newItem; | |
| 68 } | |
| 69 return null; | |
| 70 } | |
| 71 | 72 |
| 72 add() { | 73 void add() { |
| 73 if (newItem.isEmpty) return; | 74 if (newItem.isEmpty) return; |
| 74 | 75 |
| 75 items.add(newItem.clone()); | 76 items.add(newItem.clone()); |
| 76 newItem.clear(); | 77 newItem.clear(); |
| 77 } | 78 } |
| 78 | 79 |
| 79 markAllDone() { | 80 void markAllDone() { |
| 80 items.forEach((item) => item.done = true); | 81 items.forEach((item) => item.done = true); |
| 81 } | 82 } |
| 82 | 83 |
| 83 archiveDone() { | 84 void archiveDone() { |
| 84 items.removeWhere((item) => item.done); | 85 items.removeWhere((item) => item.done); |
| 85 } | 86 } |
| 86 | 87 |
| 87 String classFor(Item item) { | 88 String classFor(Item item) => item.done ? 'done' : ''; |
| 88 return item.done ? 'done' : ''; | |
| 89 } | |
| 90 | 89 |
| 91 int remaining() { | 90 int remaining() => items.fold(0, (count, item) => count += item.done ? 0 : 1); |
| 92 return items.where((item) => !item.done).length; | |
| 93 } | |
| 94 } | 91 } |
| OLD | NEW |