Chromium Code Reviews| Index: src/site/articles/trydart/code/piratebadge.dart |
| diff --git a/src/site/articles/trydart/code/piratebadge.dart b/src/site/articles/trydart/code/piratebadge.dart |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..ce86b63002b742f2a4b363acf1882656ad62f5e4 |
| --- /dev/null |
| +++ b/src/site/articles/trydart/code/piratebadge.dart |
| @@ -0,0 +1,117 @@ |
| +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| +// for details. All rights reserved. Use of this source code is governed by a |
| +// BSD-style license that can be found in the LICENSE file. |
| + |
| + |
| +// Demonstrates: |
| +// list, maps, random, strings, string interpolation, cascade, fat arrow, |
| +// named constructors. |
| +// optional parameters. |
| +// a class |
| +// getters, setters |
| +// httprequest, JSON |
| +// local storage |
| +// static class-level methods/fields |
| +// top-level variable and functions |
| +// typecasting with 'as' |
| +// futures |
| + |
| +import 'dart:html'; |
| +import 'dart:async'; |
| +import 'dart:math'; |
| +import 'dart:convert'; |
| + |
| +final String TREASUREKEY = 'pirateName'; |
| + |
| +void main() { |
| + InputElement inputField = query('#inputName')..onInput.listen(updateBadge); |
| + ButtonElement genButton = query('#generateButton')..onClick.listen(generateBadge); |
| + |
| + PirateName.readyThePirates() |
| + .then((obj) { |
| + inputField.disabled = false; //enable |
| + genButton.disabled = false; //enable |
| + badgeName = pirateNameFromStorage; }) |
| + .catchError((err) { |
| + print ('Error initializing pirate names: $err'); |
|
sethladd
2013/10/22 21:59:17
remove space between print and (
mem
2013/10/22 23:06:24
Done.
|
| + query('#badgeName').text = 'Arrr! No names.'; |
| + }); |
| +} |
| + |
| +get pirateNameFromStorage { |
|
sethladd
2013/10/22 21:59:17
add return type annotation
mem
2013/10/22 23:06:24
Done.
|
| + String storedName = window.localStorage[TREASUREKEY]; |
| + if (storedName != null) { |
| + return new PirateName.fromJSON(storedName); |
| + } |
|
sethladd
2013/10/22 21:59:17
add explicit return null for else
mem
2013/10/22 23:06:24
Done.
|
| +} |
| + |
| +set badgeName(PirateName newName) { |
| + query('#badgeName').text = newName.pirateName; |
|
sethladd
2013/10/22 21:59:17
you have query('#badgeName') twice in the code. pl
mem
2013/10/22 23:06:24
Done.
|
| + window.localStorage[TREASUREKEY] = newName.toJsonString(); |
| +} |
| + |
| +void updateBadge(Event e) { |
| + String inputName = (e.target as InputElement).value; |
| + ButtonElement genButton = query('#generateButton'); |
|
sethladd
2013/10/22 21:59:17
put this variable into top level so you don't need
mem
2013/10/22 23:06:24
Done.
|
| + |
| + badgeName = new PirateName(firstName: inputName); |
| + if (inputName.trim().isEmpty) { |
| + genButton..disabled = false |
| + ..text = 'Generate badge'; |
| + } else { |
| + genButton..disabled = true |
| + ..text = 'Arrr! Remove the text!'; |
| + } |
| +} |
| + |
| +void generateBadge(Event e) { |
|
sethladd
2013/10/22 21:59:17
I don't see this called from anywhere
mem
2013/10/22 23:06:24
this is the event handler for the button.
|
| + badgeName = new PirateName(); |
| +} |
| + |
| +class PirateName { |
| + |
| + static final Random indexGen = new Random(); |
| + |
| + static List<String> names = []; |
| + static List<String> appellations = []; |
| + |
| + String _firstName; |
| + String _appellation; |
| + |
| + String get pirateName => '$_firstName the $_appellation'; |
| + |
| + String toString() => pirateName; |
| + |
| + PirateName({String firstName, String appellation}) { |
|
sethladd
2013/10/22 21:59:17
typically constructor goes after the fields
mem
2013/10/22 23:06:24
Done.
|
| + if (firstName == null) { |
| + _firstName = names[indexGen.nextInt(names.length)]; |
| + } else { |
| + _firstName = firstName; |
| + } |
| + if (appellation == null) { |
| + _appellation = appellations[indexGen.nextInt(appellations.length)]; |
| + } else { |
| + _appellation = appellation; |
| + } |
| + } |
| + |
| + String toJsonString() => '{ "f": "$_firstName", "a": "$_appellation" } '; |
|
sethladd
2013/10/22 21:59:17
then move this down under constructors
mem
2013/10/22 23:06:24
Done.
|
| + |
| + PirateName.fromJSON(String jsonString) { |
| + Map storedName = JSON.decode(jsonString); |
| + _firstName = storedName['f']; |
| + _appellation = storedName['a']; |
| + } |
| + |
| + static Future readyThePirates() { |
| + var path = 'piratenames.json'; |
|
sethladd
2013/10/22 21:59:17
use String instead of var, since you use type anno
|
| + return HttpRequest.getString(path) |
| + .then(_parsePirateNamesFromJSON); |
| + } |
| + |
| + static _parsePirateNamesFromJSON(String jsonString) { |
| + Map pirateNames = JSON.decode(jsonString); |
| + names = pirateNames['names']; |
| + appellations = pirateNames['appellations']; |
| + } |
| +} |