OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 #import('dart:html'); |
| 6 |
| 7 // Utility functions: |
| 8 String safeHTML(String value) { |
| 9 // TODO(terry): TBD |
| 10 return value; |
| 11 } |
| 12 |
| 13 /* Data Model */ |
| 14 class Friend { |
| 15 String name; |
| 16 String phone; |
| 17 int age; |
| 18 int friendsCircle, familyCircle, workCircle; |
| 19 |
| 20 Friend(this.name, this.phone, this.age, |
| 21 this.friendsCircle, this.familyCircle, this.workCircle); |
| 22 } |
| 23 |
| 24 /* Simple template: |
| 25 ================ |
| 26 |
| 27 template HTML FriendList(List<Friend> friends) { |
| 28 <div>Friends: |
| 29 <ul> |
| 30 ${#each friends} // Iterates over each friend |
| 31 <li>${name}</li> // Scope of block is Friend type |
| 32 ${/each} |
| 33 </ul> |
| 34 </div> |
| 35 } |
| 36 */ |
| 37 class FriendList /*extends Template*/ { |
| 38 Element _fragment; |
| 39 |
| 40 // ${#each friends} |
| 41 each_0(List items, Element parent) { |
| 42 for (var item in items) { |
| 43 var e0 = new Element.html('<li></li>'); // Node before injection |
| 44 e0.innerHTML = inject_0(item); |
| 45 parent.elements.add(e0); |
| 46 } |
| 47 } |
| 48 |
| 49 // ${name} |
| 50 String inject_0(item) { |
| 51 return safeHTML('''${item.name}'''); |
| 52 } |
| 53 |
| 54 FriendList(List<Friend> friends) { |
| 55 _fragment = new Element.tag('div'); |
| 56 Element e0 = new Element.html('<div>Friends:</div>'); |
| 57 _fragment.elements.add(e0); |
| 58 Element e0_0 = new Element.html('<ul></ul>'); // Node before #each |
| 59 e0.elements.add(e0_0); |
| 60 each_0(friends, e0_0); |
| 61 } |
| 62 |
| 63 Element get root() => _fragment.nodes.first; |
| 64 |
| 65 String toString(){ |
| 66 return _fragment.innerHTML; |
| 67 } |
| 68 } |
| 69 |
| 70 |
| 71 /* More template control: |
| 72 ====================== |
| 73 |
| 74 template HTML FriendEntry(Friend friend) { |
| 75 <li> |
| 76 ${#with friend} |
| 77 <span>${name}</span> |
| 78 ${#if (age < 18)} |
| 79 <span class=”left-space”>child</span> |
| 80 ${#else} |
| 81 <span class=”left-space”>adult</span> |
| 82 ${/if} |
| 83 <span class=”left-space”>circles = ${friendCircle + familyCircle + workC
ircle}</span> |
| 84 ${/friend} |
| 85 </li> |
| 86 } |
| 87 */ |
| 88 class FriendEntry /*extends Template*/ { |
| 89 Element _fragment; |
| 90 |
| 91 // ${#with friend} |
| 92 with_0(Friend item, Element parent) { |
| 93 var e0 = new Element.html('<span></span>'); // Node before injection |
| 94 e0.innerHTML = inject_0(item); |
| 95 parent.elements.add(e0); |
| 96 |
| 97 // ${#if expression} |
| 98 if (if_0(item)) { |
| 99 var e1 = new Element.html('<span class="left-space">child</span>'); |
| 100 parent.elements.add(e1); |
| 101 } else { |
| 102 var e2 = new Element.html('<span class="left-space">adult</span>'); |
| 103 parent.elements.add(e2); |
| 104 } |
| 105 |
| 106 // Node before injection. |
| 107 var e3 = new Element.html('<span class="left-space"></span>'); |
| 108 e3.innerHTML = inject_1(item); |
| 109 parent.elements.add(e3); |
| 110 } |
| 111 |
| 112 // expression (age < 18)} |
| 113 bool if_0(var item) { |
| 114 return (item.age < 18); |
| 115 } |
| 116 |
| 117 // ${name} |
| 118 String inject_0(item) { |
| 119 return safeHTML('''${item.name}'''); |
| 120 } |
| 121 |
| 122 // ${friendCircle + family.Circle + workCircle |
| 123 String inject_1(item) { |
| 124 return safeHTML('circles = ${item.friendsCircle + item.familyCircle + item.w
orkCircle}'); |
| 125 } |
| 126 |
| 127 FriendEntry(Friend friend) { |
| 128 _fragment = new Element.tag('div'); |
| 129 Element e0 = new Element.html('<li></li>'); // Node before #with |
| 130 _fragment.elements.add(e0); |
| 131 with_0(friend, e0); |
| 132 } |
| 133 |
| 134 Element get root() => _fragment.nodes.first; |
| 135 |
| 136 String toString(){ |
| 137 return _fragment.innerHTML; |
| 138 } |
| 139 } |
| 140 |
| 141 |
| 142 /* Template with events: |
| 143 ===================== |
| 144 |
| 145 template HTML FriendEntryEvents(Friend friend) { |
| 146 <li> |
| 147 ${#with friend} |
| 148 <span var=friendElem style="cursor: pointer;">${name}</span> |
| 149 ${#if (age < 18)} |
| 150 <span class=”left-space”>child</span> |
| 151 ${#else} |
| 152 <span class=”left-space”>adult</span> |
| 153 ${/if} |
| 154 <span class=”left-space”>circles = ${friendCircle + familyCircle + workCi
rcle}</span> |
| 155 ${/friend} |
| 156 </li> |
| 157 } |
| 158 */ |
| 159 class FriendEntryEvents /*extends Template*/ { |
| 160 Element _fragment; |
| 161 var _friendElem; |
| 162 |
| 163 get friendElem() => _friendElem; |
| 164 |
| 165 // ${#with friend} |
| 166 with_0(Friend item, Element parent) { |
| 167 _friendElem = new Element.html('<span style="cursor: pointer;"></span>'); /
/ Node before injection |
| 168 _friendElem.innerHTML = inject_0(item); |
| 169 parent.elements.add(_friendElem); |
| 170 |
| 171 // ${#if expression} |
| 172 if (if_0(item)) { |
| 173 var e1 = new Element.html('<span class="left-space">child</span>'); |
| 174 parent.elements.add(e1); |
| 175 } else { |
| 176 var e2 = new Element.html('<span class="left-space">adult</span>'); |
| 177 parent.elements.add(e2); |
| 178 } |
| 179 |
| 180 // Node before injection. |
| 181 var e3 = new Element.html('<span class="left-space"></span>'); |
| 182 e3.innerHTML = inject_1(item); |
| 183 parent.elements.add(e3); |
| 184 } |
| 185 |
| 186 // expression (age < 18)} |
| 187 bool if_0(var item) { |
| 188 return (item.age < 18); |
| 189 } |
| 190 |
| 191 // ${name} |
| 192 String inject_0(item) { |
| 193 return safeHTML('''${item.name}'''); |
| 194 } |
| 195 |
| 196 // ${friendCircle + family.Circle + workCircle |
| 197 String inject_1(item) { |
| 198 return safeHTML('circles = ${item.friendsCircle + item.familyCircle + item.wo
rkCircle}'); |
| 199 } |
| 200 |
| 201 FriendEntryEvents(Friend friend) { |
| 202 _fragment = new Element.tag('div'); |
| 203 Element e0 = new Element.html('<li></li>'); // Node before #with |
| 204 _fragment.elements.add(e0); |
| 205 with_0(friend, e0); |
| 206 } |
| 207 |
| 208 Element get root() => _fragment.nodes.first; |
| 209 |
| 210 String toString(){ |
| 211 return _fragment.innerHTML; |
| 212 } |
| 213 } |
| 214 |
| 215 |
| 216 void main() { |
| 217 // Setup style sheet for page. |
| 218 document.head.elements.add(new Element.html('<style>.left-space { margin-left:
10px; }</style>')); |
| 219 |
| 220 // Create data model. |
| 221 List<Friend> friends = new List<Friend>(); |
| 222 friends.add(new Friend('Tom','425.123.4567', 35, 20, 10, 40)); |
| 223 friends.add(new Friend('Sue','802.987.6543', 23, 53, 25, 80)); |
| 224 friends.add(new Friend('Bill','617.123.4444', 50, 10, 5, 110)); |
| 225 |
| 226 // Simple template. |
| 227 document.body.elements.add(new FriendList(friends).root); |
| 228 |
| 229 // Use control template. |
| 230 document.body.elements.add(new FriendEntry(friends[0]).root); |
| 231 |
| 232 // Template with Events: |
| 233 var clickableFriend = new FriendEntryEvents(friends[0]); |
| 234 document.body.elements.add(clickableFriend.root); |
| 235 clickableFriend.friendElem.on.click.add((e) { |
| 236 var elemStyle = e.srcElement.style; |
| 237 String toggleColor = elemStyle.getPropertyValue("background-color") == "red"
? "white" : "red"; |
| 238 elemStyle.setProperty("background-color", "${toggleColor}"); |
| 239 }); |
| 240 |
| 241 // Calling template inside of a template: |
| 242 // document.body.elements.add(new Templates(friends).root); |
| 243 } |
OLD | NEW |