angularjs-rails 1.0.8 → 1.2.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/lib/angularjs-rails/version.rb +1 -1
  4. data/vendor/assets/javascripts/angular-animate.js +677 -0
  5. data/vendor/assets/javascripts/angular-bootstrap-prettify.js +4 -14
  6. data/vendor/assets/javascripts/angular-bootstrap.js +1 -1
  7. data/vendor/assets/javascripts/angular-cookies.js +2 -14
  8. data/vendor/assets/javascripts/angular-loader.js +38 -4
  9. data/vendor/assets/javascripts/angular-mocks.js +225 -78
  10. data/vendor/assets/javascripts/angular-resource.js +181 -90
  11. data/vendor/assets/javascripts/angular-route.js +860 -0
  12. data/vendor/assets/javascripts/angular-sanitize.js +63 -61
  13. data/vendor/assets/javascripts/angular-scenario.js +21160 -18250
  14. data/vendor/assets/javascripts/angular-touch.js +536 -0
  15. data/vendor/assets/javascripts/angular.js +7827 -5083
  16. metadata +8 -292
  17. data/vendor/assets/javascripts/i18n/angular-locale_af-na.js +0 -98
  18. data/vendor/assets/javascripts/i18n/angular-locale_af-za.js +0 -98
  19. data/vendor/assets/javascripts/i18n/angular-locale_af.js +0 -98
  20. data/vendor/assets/javascripts/i18n/angular-locale_am-et.js +0 -98
  21. data/vendor/assets/javascripts/i18n/angular-locale_am.js +0 -98
  22. data/vendor/assets/javascripts/i18n/angular-locale_ar-001.js +0 -98
  23. data/vendor/assets/javascripts/i18n/angular-locale_ar-ae.js +0 -98
  24. data/vendor/assets/javascripts/i18n/angular-locale_ar-bh.js +0 -98
  25. data/vendor/assets/javascripts/i18n/angular-locale_ar-dz.js +0 -98
  26. data/vendor/assets/javascripts/i18n/angular-locale_ar-eg.js +0 -98
  27. data/vendor/assets/javascripts/i18n/angular-locale_ar-iq.js +0 -98
  28. data/vendor/assets/javascripts/i18n/angular-locale_ar-jo.js +0 -98
  29. data/vendor/assets/javascripts/i18n/angular-locale_ar-kw.js +0 -98
  30. data/vendor/assets/javascripts/i18n/angular-locale_ar-lb.js +0 -98
  31. data/vendor/assets/javascripts/i18n/angular-locale_ar-ly.js +0 -98
  32. data/vendor/assets/javascripts/i18n/angular-locale_ar-ma.js +0 -98
  33. data/vendor/assets/javascripts/i18n/angular-locale_ar-om.js +0 -98
  34. data/vendor/assets/javascripts/i18n/angular-locale_ar-qa.js +0 -98
  35. data/vendor/assets/javascripts/i18n/angular-locale_ar-sa.js +0 -98
  36. data/vendor/assets/javascripts/i18n/angular-locale_ar-sd.js +0 -98
  37. data/vendor/assets/javascripts/i18n/angular-locale_ar-sy.js +0 -98
  38. data/vendor/assets/javascripts/i18n/angular-locale_ar-tn.js +0 -98
  39. data/vendor/assets/javascripts/i18n/angular-locale_ar-ye.js +0 -98
  40. data/vendor/assets/javascripts/i18n/angular-locale_ar.js +0 -98
  41. data/vendor/assets/javascripts/i18n/angular-locale_bg-bg.js +0 -98
  42. data/vendor/assets/javascripts/i18n/angular-locale_bg.js +0 -98
  43. data/vendor/assets/javascripts/i18n/angular-locale_bn-bd.js +0 -98
  44. data/vendor/assets/javascripts/i18n/angular-locale_bn-in.js +0 -98
  45. data/vendor/assets/javascripts/i18n/angular-locale_bn.js +0 -98
  46. data/vendor/assets/javascripts/i18n/angular-locale_ca-ad.js +0 -98
  47. data/vendor/assets/javascripts/i18n/angular-locale_ca-es.js +0 -98
  48. data/vendor/assets/javascripts/i18n/angular-locale_ca.js +0 -98
  49. data/vendor/assets/javascripts/i18n/angular-locale_chr.js +0 -4
  50. data/vendor/assets/javascripts/i18n/angular-locale_cs-cz.js +0 -98
  51. data/vendor/assets/javascripts/i18n/angular-locale_cs.js +0 -98
  52. data/vendor/assets/javascripts/i18n/angular-locale_cy.js +0 -4
  53. data/vendor/assets/javascripts/i18n/angular-locale_da-dk.js +0 -98
  54. data/vendor/assets/javascripts/i18n/angular-locale_da.js +0 -98
  55. data/vendor/assets/javascripts/i18n/angular-locale_de-at.js +0 -98
  56. data/vendor/assets/javascripts/i18n/angular-locale_de-be.js +0 -98
  57. data/vendor/assets/javascripts/i18n/angular-locale_de-ch.js +0 -98
  58. data/vendor/assets/javascripts/i18n/angular-locale_de-de.js +0 -98
  59. data/vendor/assets/javascripts/i18n/angular-locale_de-li.js +0 -98
  60. data/vendor/assets/javascripts/i18n/angular-locale_de-lu.js +0 -98
  61. data/vendor/assets/javascripts/i18n/angular-locale_de.js +0 -98
  62. data/vendor/assets/javascripts/i18n/angular-locale_el-cy.js +0 -98
  63. data/vendor/assets/javascripts/i18n/angular-locale_el-gr.js +0 -98
  64. data/vendor/assets/javascripts/i18n/angular-locale_el-polyton.js +0 -4
  65. data/vendor/assets/javascripts/i18n/angular-locale_el.js +0 -98
  66. data/vendor/assets/javascripts/i18n/angular-locale_en-as.js +0 -98
  67. data/vendor/assets/javascripts/i18n/angular-locale_en-au.js +0 -98
  68. data/vendor/assets/javascripts/i18n/angular-locale_en-bb.js +0 -98
  69. data/vendor/assets/javascripts/i18n/angular-locale_en-be.js +0 -98
  70. data/vendor/assets/javascripts/i18n/angular-locale_en-bm.js +0 -98
  71. data/vendor/assets/javascripts/i18n/angular-locale_en-bw.js +0 -98
  72. data/vendor/assets/javascripts/i18n/angular-locale_en-bz.js +0 -98
  73. data/vendor/assets/javascripts/i18n/angular-locale_en-ca.js +0 -98
  74. data/vendor/assets/javascripts/i18n/angular-locale_en-dsrt-us.js +0 -98
  75. data/vendor/assets/javascripts/i18n/angular-locale_en-dsrt.js +0 -98
  76. data/vendor/assets/javascripts/i18n/angular-locale_en-fm.js +0 -98
  77. data/vendor/assets/javascripts/i18n/angular-locale_en-gb.js +0 -98
  78. data/vendor/assets/javascripts/i18n/angular-locale_en-gu.js +0 -98
  79. data/vendor/assets/javascripts/i18n/angular-locale_en-gy.js +0 -98
  80. data/vendor/assets/javascripts/i18n/angular-locale_en-hk.js +0 -98
  81. data/vendor/assets/javascripts/i18n/angular-locale_en-ie.js +0 -98
  82. data/vendor/assets/javascripts/i18n/angular-locale_en-in.js +0 -98
  83. data/vendor/assets/javascripts/i18n/angular-locale_en-iso.js +0 -98
  84. data/vendor/assets/javascripts/i18n/angular-locale_en-jm.js +0 -98
  85. data/vendor/assets/javascripts/i18n/angular-locale_en-mh.js +0 -98
  86. data/vendor/assets/javascripts/i18n/angular-locale_en-mp.js +0 -98
  87. data/vendor/assets/javascripts/i18n/angular-locale_en-mt.js +0 -98
  88. data/vendor/assets/javascripts/i18n/angular-locale_en-mu.js +0 -98
  89. data/vendor/assets/javascripts/i18n/angular-locale_en-na.js +0 -98
  90. data/vendor/assets/javascripts/i18n/angular-locale_en-nz.js +0 -98
  91. data/vendor/assets/javascripts/i18n/angular-locale_en-ph.js +0 -98
  92. data/vendor/assets/javascripts/i18n/angular-locale_en-pk.js +0 -98
  93. data/vendor/assets/javascripts/i18n/angular-locale_en-pr.js +0 -98
  94. data/vendor/assets/javascripts/i18n/angular-locale_en-pw.js +0 -98
  95. data/vendor/assets/javascripts/i18n/angular-locale_en-sg.js +0 -98
  96. data/vendor/assets/javascripts/i18n/angular-locale_en-tc.js +0 -98
  97. data/vendor/assets/javascripts/i18n/angular-locale_en-tt.js +0 -98
  98. data/vendor/assets/javascripts/i18n/angular-locale_en-um.js +0 -98
  99. data/vendor/assets/javascripts/i18n/angular-locale_en-us.js +0 -98
  100. data/vendor/assets/javascripts/i18n/angular-locale_en-vg.js +0 -98
  101. data/vendor/assets/javascripts/i18n/angular-locale_en-vi.js +0 -98
  102. data/vendor/assets/javascripts/i18n/angular-locale_en-za.js +0 -98
  103. data/vendor/assets/javascripts/i18n/angular-locale_en-zw.js +0 -98
  104. data/vendor/assets/javascripts/i18n/angular-locale_en-zz.js +0 -4
  105. data/vendor/assets/javascripts/i18n/angular-locale_en.js +0 -98
  106. data/vendor/assets/javascripts/i18n/angular-locale_es-419.js +0 -98
  107. data/vendor/assets/javascripts/i18n/angular-locale_es-ar.js +0 -98
  108. data/vendor/assets/javascripts/i18n/angular-locale_es-bo.js +0 -98
  109. data/vendor/assets/javascripts/i18n/angular-locale_es-cl.js +0 -98
  110. data/vendor/assets/javascripts/i18n/angular-locale_es-co.js +0 -98
  111. data/vendor/assets/javascripts/i18n/angular-locale_es-cr.js +0 -98
  112. data/vendor/assets/javascripts/i18n/angular-locale_es-do.js +0 -98
  113. data/vendor/assets/javascripts/i18n/angular-locale_es-ea.js +0 -98
  114. data/vendor/assets/javascripts/i18n/angular-locale_es-ec.js +0 -98
  115. data/vendor/assets/javascripts/i18n/angular-locale_es-es.js +0 -98
  116. data/vendor/assets/javascripts/i18n/angular-locale_es-gq.js +0 -98
  117. data/vendor/assets/javascripts/i18n/angular-locale_es-gt.js +0 -98
  118. data/vendor/assets/javascripts/i18n/angular-locale_es-hn.js +0 -98
  119. data/vendor/assets/javascripts/i18n/angular-locale_es-ic.js +0 -98
  120. data/vendor/assets/javascripts/i18n/angular-locale_es-mx.js +0 -98
  121. data/vendor/assets/javascripts/i18n/angular-locale_es-ni.js +0 -98
  122. data/vendor/assets/javascripts/i18n/angular-locale_es-pa.js +0 -98
  123. data/vendor/assets/javascripts/i18n/angular-locale_es-pe.js +0 -98
  124. data/vendor/assets/javascripts/i18n/angular-locale_es-pr.js +0 -98
  125. data/vendor/assets/javascripts/i18n/angular-locale_es-py.js +0 -98
  126. data/vendor/assets/javascripts/i18n/angular-locale_es-sv.js +0 -98
  127. data/vendor/assets/javascripts/i18n/angular-locale_es-us.js +0 -98
  128. data/vendor/assets/javascripts/i18n/angular-locale_es-uy.js +0 -98
  129. data/vendor/assets/javascripts/i18n/angular-locale_es-ve.js +0 -98
  130. data/vendor/assets/javascripts/i18n/angular-locale_es.js +0 -98
  131. data/vendor/assets/javascripts/i18n/angular-locale_et-ee.js +0 -98
  132. data/vendor/assets/javascripts/i18n/angular-locale_et.js +0 -98
  133. data/vendor/assets/javascripts/i18n/angular-locale_eu-es.js +0 -98
  134. data/vendor/assets/javascripts/i18n/angular-locale_eu.js +0 -98
  135. data/vendor/assets/javascripts/i18n/angular-locale_fa-af.js +0 -98
  136. data/vendor/assets/javascripts/i18n/angular-locale_fa-ir.js +0 -98
  137. data/vendor/assets/javascripts/i18n/angular-locale_fa.js +0 -98
  138. data/vendor/assets/javascripts/i18n/angular-locale_fi-fi.js +0 -98
  139. data/vendor/assets/javascripts/i18n/angular-locale_fi.js +0 -98
  140. data/vendor/assets/javascripts/i18n/angular-locale_fil-ph.js +0 -98
  141. data/vendor/assets/javascripts/i18n/angular-locale_fil.js +0 -98
  142. data/vendor/assets/javascripts/i18n/angular-locale_fr-be.js +0 -98
  143. data/vendor/assets/javascripts/i18n/angular-locale_fr-bf.js +0 -98
  144. data/vendor/assets/javascripts/i18n/angular-locale_fr-bi.js +0 -98
  145. data/vendor/assets/javascripts/i18n/angular-locale_fr-bj.js +0 -98
  146. data/vendor/assets/javascripts/i18n/angular-locale_fr-bl.js +0 -98
  147. data/vendor/assets/javascripts/i18n/angular-locale_fr-ca.js +0 -98
  148. data/vendor/assets/javascripts/i18n/angular-locale_fr-cd.js +0 -98
  149. data/vendor/assets/javascripts/i18n/angular-locale_fr-cf.js +0 -98
  150. data/vendor/assets/javascripts/i18n/angular-locale_fr-cg.js +0 -98
  151. data/vendor/assets/javascripts/i18n/angular-locale_fr-ch.js +0 -98
  152. data/vendor/assets/javascripts/i18n/angular-locale_fr-ci.js +0 -98
  153. data/vendor/assets/javascripts/i18n/angular-locale_fr-cm.js +0 -98
  154. data/vendor/assets/javascripts/i18n/angular-locale_fr-dj.js +0 -98
  155. data/vendor/assets/javascripts/i18n/angular-locale_fr-fr.js +0 -98
  156. data/vendor/assets/javascripts/i18n/angular-locale_fr-ga.js +0 -98
  157. data/vendor/assets/javascripts/i18n/angular-locale_fr-gf.js +0 -98
  158. data/vendor/assets/javascripts/i18n/angular-locale_fr-gn.js +0 -98
  159. data/vendor/assets/javascripts/i18n/angular-locale_fr-gp.js +0 -98
  160. data/vendor/assets/javascripts/i18n/angular-locale_fr-gq.js +0 -98
  161. data/vendor/assets/javascripts/i18n/angular-locale_fr-km.js +0 -98
  162. data/vendor/assets/javascripts/i18n/angular-locale_fr-lu.js +0 -98
  163. data/vendor/assets/javascripts/i18n/angular-locale_fr-mc.js +0 -98
  164. data/vendor/assets/javascripts/i18n/angular-locale_fr-mf.js +0 -98
  165. data/vendor/assets/javascripts/i18n/angular-locale_fr-mg.js +0 -98
  166. data/vendor/assets/javascripts/i18n/angular-locale_fr-ml.js +0 -98
  167. data/vendor/assets/javascripts/i18n/angular-locale_fr-mq.js +0 -98
  168. data/vendor/assets/javascripts/i18n/angular-locale_fr-ne.js +0 -98
  169. data/vendor/assets/javascripts/i18n/angular-locale_fr-re.js +0 -98
  170. data/vendor/assets/javascripts/i18n/angular-locale_fr-rw.js +0 -98
  171. data/vendor/assets/javascripts/i18n/angular-locale_fr-sn.js +0 -98
  172. data/vendor/assets/javascripts/i18n/angular-locale_fr-td.js +0 -98
  173. data/vendor/assets/javascripts/i18n/angular-locale_fr-tg.js +0 -98
  174. data/vendor/assets/javascripts/i18n/angular-locale_fr-yt.js +0 -98
  175. data/vendor/assets/javascripts/i18n/angular-locale_fr.js +0 -98
  176. data/vendor/assets/javascripts/i18n/angular-locale_gl-es.js +0 -98
  177. data/vendor/assets/javascripts/i18n/angular-locale_gl.js +0 -98
  178. data/vendor/assets/javascripts/i18n/angular-locale_gsw-ch.js +0 -98
  179. data/vendor/assets/javascripts/i18n/angular-locale_gsw.js +0 -98
  180. data/vendor/assets/javascripts/i18n/angular-locale_gu-in.js +0 -98
  181. data/vendor/assets/javascripts/i18n/angular-locale_gu.js +0 -98
  182. data/vendor/assets/javascripts/i18n/angular-locale_haw.js +0 -4
  183. data/vendor/assets/javascripts/i18n/angular-locale_he-il.js +0 -98
  184. data/vendor/assets/javascripts/i18n/angular-locale_he.js +0 -98
  185. data/vendor/assets/javascripts/i18n/angular-locale_hi-in.js +0 -98
  186. data/vendor/assets/javascripts/i18n/angular-locale_hi.js +0 -98
  187. data/vendor/assets/javascripts/i18n/angular-locale_hr-hr.js +0 -98
  188. data/vendor/assets/javascripts/i18n/angular-locale_hr.js +0 -98
  189. data/vendor/assets/javascripts/i18n/angular-locale_hu-hu.js +0 -98
  190. data/vendor/assets/javascripts/i18n/angular-locale_hu.js +0 -98
  191. data/vendor/assets/javascripts/i18n/angular-locale_id-id.js +0 -98
  192. data/vendor/assets/javascripts/i18n/angular-locale_id.js +0 -98
  193. data/vendor/assets/javascripts/i18n/angular-locale_in.js +0 -98
  194. data/vendor/assets/javascripts/i18n/angular-locale_is-is.js +0 -98
  195. data/vendor/assets/javascripts/i18n/angular-locale_is.js +0 -98
  196. data/vendor/assets/javascripts/i18n/angular-locale_it-ch.js +0 -98
  197. data/vendor/assets/javascripts/i18n/angular-locale_it-it.js +0 -98
  198. data/vendor/assets/javascripts/i18n/angular-locale_it-sm.js +0 -98
  199. data/vendor/assets/javascripts/i18n/angular-locale_it.js +0 -98
  200. data/vendor/assets/javascripts/i18n/angular-locale_iw.js +0 -98
  201. data/vendor/assets/javascripts/i18n/angular-locale_ja-jp.js +0 -98
  202. data/vendor/assets/javascripts/i18n/angular-locale_ja.js +0 -98
  203. data/vendor/assets/javascripts/i18n/angular-locale_kn-in.js +0 -98
  204. data/vendor/assets/javascripts/i18n/angular-locale_kn.js +0 -98
  205. data/vendor/assets/javascripts/i18n/angular-locale_ko-kr.js +0 -98
  206. data/vendor/assets/javascripts/i18n/angular-locale_ko.js +0 -98
  207. data/vendor/assets/javascripts/i18n/angular-locale_ln-cd.js +0 -98
  208. data/vendor/assets/javascripts/i18n/angular-locale_ln-cg.js +0 -98
  209. data/vendor/assets/javascripts/i18n/angular-locale_ln.js +0 -98
  210. data/vendor/assets/javascripts/i18n/angular-locale_lt-lt.js +0 -98
  211. data/vendor/assets/javascripts/i18n/angular-locale_lt.js +0 -98
  212. data/vendor/assets/javascripts/i18n/angular-locale_lv-lv.js +0 -98
  213. data/vendor/assets/javascripts/i18n/angular-locale_lv.js +0 -98
  214. data/vendor/assets/javascripts/i18n/angular-locale_ml-in.js +0 -98
  215. data/vendor/assets/javascripts/i18n/angular-locale_ml.js +0 -98
  216. data/vendor/assets/javascripts/i18n/angular-locale_mo.js +0 -4
  217. data/vendor/assets/javascripts/i18n/angular-locale_mr-in.js +0 -98
  218. data/vendor/assets/javascripts/i18n/angular-locale_mr.js +0 -98
  219. data/vendor/assets/javascripts/i18n/angular-locale_ms-bn.js +0 -98
  220. data/vendor/assets/javascripts/i18n/angular-locale_ms-my.js +0 -98
  221. data/vendor/assets/javascripts/i18n/angular-locale_ms.js +0 -98
  222. data/vendor/assets/javascripts/i18n/angular-locale_mt-mt.js +0 -98
  223. data/vendor/assets/javascripts/i18n/angular-locale_mt.js +0 -98
  224. data/vendor/assets/javascripts/i18n/angular-locale_nl-aw.js +0 -98
  225. data/vendor/assets/javascripts/i18n/angular-locale_nl-be.js +0 -98
  226. data/vendor/assets/javascripts/i18n/angular-locale_nl-cw.js +0 -98
  227. data/vendor/assets/javascripts/i18n/angular-locale_nl-nl.js +0 -98
  228. data/vendor/assets/javascripts/i18n/angular-locale_nl-sx.js +0 -98
  229. data/vendor/assets/javascripts/i18n/angular-locale_nl.js +0 -98
  230. data/vendor/assets/javascripts/i18n/angular-locale_no.js +0 -98
  231. data/vendor/assets/javascripts/i18n/angular-locale_or-in.js +0 -98
  232. data/vendor/assets/javascripts/i18n/angular-locale_or.js +0 -98
  233. data/vendor/assets/javascripts/i18n/angular-locale_pl-pl.js +0 -98
  234. data/vendor/assets/javascripts/i18n/angular-locale_pl.js +0 -98
  235. data/vendor/assets/javascripts/i18n/angular-locale_pt-ao.js +0 -98
  236. data/vendor/assets/javascripts/i18n/angular-locale_pt-br.js +0 -98
  237. data/vendor/assets/javascripts/i18n/angular-locale_pt-gw.js +0 -98
  238. data/vendor/assets/javascripts/i18n/angular-locale_pt-mz.js +0 -98
  239. data/vendor/assets/javascripts/i18n/angular-locale_pt-pt.js +0 -98
  240. data/vendor/assets/javascripts/i18n/angular-locale_pt-st.js +0 -98
  241. data/vendor/assets/javascripts/i18n/angular-locale_pt.js +0 -98
  242. data/vendor/assets/javascripts/i18n/angular-locale_ro-md.js +0 -98
  243. data/vendor/assets/javascripts/i18n/angular-locale_ro-ro.js +0 -98
  244. data/vendor/assets/javascripts/i18n/angular-locale_ro.js +0 -98
  245. data/vendor/assets/javascripts/i18n/angular-locale_ru-md.js +0 -98
  246. data/vendor/assets/javascripts/i18n/angular-locale_ru-ru.js +0 -98
  247. data/vendor/assets/javascripts/i18n/angular-locale_ru-ua.js +0 -98
  248. data/vendor/assets/javascripts/i18n/angular-locale_ru.js +0 -98
  249. data/vendor/assets/javascripts/i18n/angular-locale_sk-sk.js +0 -98
  250. data/vendor/assets/javascripts/i18n/angular-locale_sk.js +0 -98
  251. data/vendor/assets/javascripts/i18n/angular-locale_sl-si.js +0 -98
  252. data/vendor/assets/javascripts/i18n/angular-locale_sl.js +0 -98
  253. data/vendor/assets/javascripts/i18n/angular-locale_sq-al.js +0 -98
  254. data/vendor/assets/javascripts/i18n/angular-locale_sq.js +0 -98
  255. data/vendor/assets/javascripts/i18n/angular-locale_sr-cyrl-ba.js +0 -98
  256. data/vendor/assets/javascripts/i18n/angular-locale_sr-cyrl-me.js +0 -98
  257. data/vendor/assets/javascripts/i18n/angular-locale_sr-cyrl-rs.js +0 -98
  258. data/vendor/assets/javascripts/i18n/angular-locale_sr-cyrl.js +0 -98
  259. data/vendor/assets/javascripts/i18n/angular-locale_sr-latn-ba.js +0 -98
  260. data/vendor/assets/javascripts/i18n/angular-locale_sr-latn-me.js +0 -98
  261. data/vendor/assets/javascripts/i18n/angular-locale_sr-latn-rs.js +0 -98
  262. data/vendor/assets/javascripts/i18n/angular-locale_sr-latn.js +0 -98
  263. data/vendor/assets/javascripts/i18n/angular-locale_sr-rs.js +0 -4
  264. data/vendor/assets/javascripts/i18n/angular-locale_sr.js +0 -98
  265. data/vendor/assets/javascripts/i18n/angular-locale_sv-fi.js +0 -98
  266. data/vendor/assets/javascripts/i18n/angular-locale_sv-se.js +0 -98
  267. data/vendor/assets/javascripts/i18n/angular-locale_sv.js +0 -98
  268. data/vendor/assets/javascripts/i18n/angular-locale_sw-ke.js +0 -98
  269. data/vendor/assets/javascripts/i18n/angular-locale_sw-tz.js +0 -98
  270. data/vendor/assets/javascripts/i18n/angular-locale_sw.js +0 -98
  271. data/vendor/assets/javascripts/i18n/angular-locale_ta-in.js +0 -98
  272. data/vendor/assets/javascripts/i18n/angular-locale_ta-lk.js +0 -98
  273. data/vendor/assets/javascripts/i18n/angular-locale_ta.js +0 -98
  274. data/vendor/assets/javascripts/i18n/angular-locale_te-in.js +0 -98
  275. data/vendor/assets/javascripts/i18n/angular-locale_te.js +0 -98
  276. data/vendor/assets/javascripts/i18n/angular-locale_th-th.js +0 -98
  277. data/vendor/assets/javascripts/i18n/angular-locale_th.js +0 -98
  278. data/vendor/assets/javascripts/i18n/angular-locale_tl-ph.js +0 -4
  279. data/vendor/assets/javascripts/i18n/angular-locale_tl.js +0 -98
  280. data/vendor/assets/javascripts/i18n/angular-locale_tr-tr.js +0 -98
  281. data/vendor/assets/javascripts/i18n/angular-locale_tr.js +0 -98
  282. data/vendor/assets/javascripts/i18n/angular-locale_uk-ua.js +0 -98
  283. data/vendor/assets/javascripts/i18n/angular-locale_uk.js +0 -98
  284. data/vendor/assets/javascripts/i18n/angular-locale_ur-in.js +0 -98
  285. data/vendor/assets/javascripts/i18n/angular-locale_ur-pk.js +0 -98
  286. data/vendor/assets/javascripts/i18n/angular-locale_ur.js +0 -98
  287. data/vendor/assets/javascripts/i18n/angular-locale_vi-vn.js +0 -98
  288. data/vendor/assets/javascripts/i18n/angular-locale_vi.js +0 -98
  289. data/vendor/assets/javascripts/i18n/angular-locale_zh-cn.js +0 -98
  290. data/vendor/assets/javascripts/i18n/angular-locale_zh-hans-cn.js +0 -98
  291. data/vendor/assets/javascripts/i18n/angular-locale_zh-hans-hk.js +0 -98
  292. data/vendor/assets/javascripts/i18n/angular-locale_zh-hans-mo.js +0 -98
  293. data/vendor/assets/javascripts/i18n/angular-locale_zh-hans-sg.js +0 -98
  294. data/vendor/assets/javascripts/i18n/angular-locale_zh-hans.js +0 -98
  295. data/vendor/assets/javascripts/i18n/angular-locale_zh-hant-hk.js +0 -98
  296. data/vendor/assets/javascripts/i18n/angular-locale_zh-hant-mo.js +0 -98
  297. data/vendor/assets/javascripts/i18n/angular-locale_zh-hant-tw.js +0 -98
  298. data/vendor/assets/javascripts/i18n/angular-locale_zh-hant.js +0 -98
  299. data/vendor/assets/javascripts/i18n/angular-locale_zh-hk.js +0 -98
  300. data/vendor/assets/javascripts/i18n/angular-locale_zh-tw.js +0 -98
  301. data/vendor/assets/javascripts/i18n/angular-locale_zh.js +0 -98
  302. data/vendor/assets/javascripts/i18n/angular-locale_zu-za.js +0 -98
  303. data/vendor/assets/javascripts/i18n/angular-locale_zu.js +0 -98
@@ -1,10 +1,11 @@
1
1
  /**
2
- * @license AngularJS v1.0.8
2
+ * @license AngularJS v1.2.0rc1
3
3
  * (c) 2010-2012 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
6
- (function(window, angular, undefined) {
7
- 'use strict';
6
+ (function(window, angular, undefined) {'use strict';
7
+
8
+ var $resourceMinErr = angular.$$minErr('$resource');
8
9
 
9
10
  /**
10
11
  * @ngdoc overview
@@ -25,7 +26,7 @@
25
26
  * the need to interact with the low level {@link ng.$http $http} service.
26
27
  *
27
28
  * # Installation
28
- * To use $resource make sure you have included the `angular-resource.js` that comes in Angular
29
+ * To use $resource make sure you have included the `angular-resource.js` that comes in Angular
29
30
  * package. You can also find this file on Google CDN, bower as well as at
30
31
  * {@link http://code.angularjs.org/ code.angularjs.org}.
31
32
  *
@@ -35,13 +36,20 @@
35
36
  *
36
37
  * and you are ready to get started!
37
38
  *
38
- * @param {string} url A parameterized URL template with parameters prefixed by `:` as in
39
- * `/user/:username`. If you are using a URL with a port number (e.g.
40
- * `http://example.com:8080/api`), you'll need to escape the colon character before the port
41
- * number, like this: `$resource('http://example.com\\:8080/api')`.
39
+ * @param {string} url A parametrized URL template with parameters prefixed by `:` as in
40
+ * `/user/:username`. If you are using a URL with a port number (e.g.
41
+ * `http://example.com:8080/api`), it will be respected.
42
+ *
43
+ * If you are using a url with a suffix, just add the suffix, like this:
44
+ * `$resource('http://example.com/resource.json')` or `$resource('http://example.com/:id.json')
45
+ * or even `$resource('http://example.com/resource/:resource_id.:format')`
46
+ * If the parameter before the suffix is empty, :resource_id in this case, then the `/.` will be
47
+ * collapsed down to a single `.`. If you need this sequence to appear and not collapse then you
48
+ * can escape it with `/\.`.
42
49
  *
43
50
  * @param {Object=} paramDefaults Default values for `url` parameters. These can be overridden in
44
- * `actions` methods.
51
+ * `actions` methods. If any of the parameter value is a function, it will be executed every time
52
+ * when a param value needs to be obtained for a request (unless the param was overridden).
45
53
  *
46
54
  * Each key value in the parameter object is first bound to url template if present and then any
47
55
  * excess keys are appended to the url search query after the `?`.
@@ -53,21 +61,46 @@
53
61
  * the data object (useful for non-GET operations).
54
62
  *
55
63
  * @param {Object.<Object>=} actions Hash with declaration of custom action that should extend the
56
- * default set of resource actions. The declaration should be created in the following format:
64
+ * default set of resource actions. The declaration should be created in the format of {@link
65
+ * ng.$http#Parameters $http.config}:
57
66
  *
58
- * {action1: {method:?, params:?, isArray:?},
59
- * action2: {method:?, params:?, isArray:?},
67
+ * {action1: {method:?, params:?, isArray:?, headers:?, ...},
68
+ * action2: {method:?, params:?, isArray:?, headers:?, ...},
60
69
  * ...}
61
70
  *
62
71
  * Where:
63
72
  *
64
- * - `action` – {string} – The name of action. This name becomes the name of the method on your
73
+ * - **`action`** – {string} – The name of action. This name becomes the name of the method on your
65
74
  * resource object.
66
- * - `method` – {string} – HTTP request method. Valid methods are: `GET`, `POST`, `PUT`, `DELETE`,
67
- * and `JSONP`
68
- * - `params` – {object=} – Optional set of pre-bound parameters for this action.
69
- * - isArray {boolean=} If true then the returned object for this action is an array, see
75
+ * - **`method`** – {string} – HTTP request method. Valid methods are: `GET`, `POST`, `PUT`, `DELETE`,
76
+ * and `JSONP`.
77
+ * - **`params`** – {Object=} – Optional set of pre-bound parameters for this action. If any of the
78
+ * parameter value is a function, it will be executed every time when a param value needs to be
79
+ * obtained for a request (unless the param was overridden).
80
+ * - **`url`** – {string} – action specific `url` override. The url templating is supported just like
81
+ * for the resource-level urls.
82
+ * - **`isArray`** – {boolean=} – If true then the returned object for this action is an array, see
70
83
  * `returns` section.
84
+ * - **`transformRequest`** – `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
85
+ * transform function or an array of such functions. The transform function takes the http
86
+ * request body and headers and returns its transformed (typically serialized) version.
87
+ * - **`transformResponse`** – `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
88
+ * transform function or an array of such functions. The transform function takes the http
89
+ * response body and headers and returns its transformed (typically deserialized) version.
90
+ * - **`cache`** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the
91
+ * GET request, otherwise if a cache instance built with
92
+ * {@link ng.$cacheFactory $cacheFactory}, this cache will be used for
93
+ * caching.
94
+ * - **`timeout`** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise} that
95
+ * should abort the request when resolved.
96
+ * - **`withCredentials`** - `{boolean}` - whether to to set the `withCredentials` flag on the
97
+ * XHR object. See {@link https://developer.mozilla.org/en/http_access_control#section_5
98
+ * requests with credentials} for more information.
99
+ * - **`responseType`** - `{string}` - see {@link
100
+ * https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType requestType}.
101
+ * - **`interceptor`** - `{Object=}` - The interceptor object has two optional methods -
102
+ * `response` and `responseError`. Both `response` and `responseError` interceptors get called
103
+ * with `http response` object. See {@link ng.$http $http interceptors}.
71
104
  *
72
105
  * @returns {Object} A resource "class" object with methods for the default set of resource actions
73
106
  * optionally extended with custom `actions`. The default set contains these actions:
@@ -106,6 +139,27 @@
106
139
  * - non-GET "class" actions: `Resource.action([parameters], postData, [success], [error])`
107
140
  * - non-GET instance actions: `instance.$action([parameters], [success], [error])`
108
141
  *
142
+ * Success callback is called with (value, responseHeaders) arguments. Error callback is called
143
+ * with (httpResponse) argument.
144
+ *
145
+ * Class actions return empty instance (with additional properties below).
146
+ * Instance actions return promise of the action.
147
+ *
148
+ * The Resource instances and collection have these additional properties:
149
+ *
150
+ * - `$promise`: the {@link ng.$q promise} of the original server interaction that created this
151
+ * instance or collection.
152
+ *
153
+ * On success, the promise is resolved with the same resource instance or collection object,
154
+ * updated with data from server. This makes it easy to use in
155
+ * {@link ngRoute.$routeProvider resolve section of $routeProvider.when()} to defer view rendering
156
+ * until the resource(s) are loaded.
157
+ *
158
+ * On failure, the promise is resolved with the {@link ng.$http http response} object,
159
+ * without the `resource` property.
160
+ *
161
+ * - `$resolved`: `true` after first server interaction is completed (either with success or rejection),
162
+ * `false` before that. Knowing if the Resource has been resolved is useful in data-binding.
109
163
  *
110
164
  * @example
111
165
  *
@@ -149,7 +203,7 @@
149
203
  * The object returned from this function execution is a resource "class" which has "static" method
150
204
  * for each action in the definition.
151
205
  *
152
- * Calling these methods invoke `$http` on the `url` template with the given `method` and `params`.
206
+ * Calling these methods invoke `$http` on the `url` template with the given `method`, `params` and `headers`.
153
207
  * When the data is returned from the server then the object is an instance of the resource type and
154
208
  * all of the non-GET methods are available with `$` prefix. This allows you to easily support CRUD
155
209
  * operations (create, read, update, delete) on server-side data.
@@ -226,7 +280,7 @@
226
280
  </doc:example>
227
281
  */
228
282
  angular.module('ngResource', ['ng']).
229
- factory('$resource', ['$http', '$parse', function($http, $parse) {
283
+ factory('$resource', ['$http', '$parse', '$q', function($http, $parse, $q) {
230
284
  var DEFAULT_ACTIONS = {
231
285
  'get': {method:'GET'},
232
286
  'save': {method:'POST'},
@@ -264,7 +318,7 @@ angular.module('ngResource', ['ng']).
264
318
 
265
319
  /**
266
320
  * This method is intended for encoding *key* or *value* parts of query component. We need a custom
267
- * method becuase encodeURIComponent is too agressive and encodes stuff that doesn't have to be
321
+ * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be
268
322
  * encoded per http://tools.ietf.org/html/rfc3986:
269
323
  * query = *( pchar / "/" / "?" )
270
324
  * pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
@@ -283,32 +337,34 @@ angular.module('ngResource', ['ng']).
283
337
  }
284
338
 
285
339
  function Route(template, defaults) {
286
- this.template = template = template + '#';
340
+ this.template = template;
287
341
  this.defaults = defaults || {};
288
- var urlParams = this.urlParams = {};
289
- forEach(template.split(/\W/), function(param){
290
- if (param && (new RegExp("(^|[^\\\\]):" + param + "\\W").test(template))) {
291
- urlParams[param] = true;
292
- }
293
- });
294
- this.template = template.replace(/\\:/g, ':');
342
+ this.urlParams = {};
295
343
  }
296
344
 
297
345
  Route.prototype = {
298
- url: function(params) {
346
+ setUrlParams: function(config, params, actionUrl) {
299
347
  var self = this,
300
- url = this.template,
348
+ url = actionUrl || self.template,
301
349
  val,
302
350
  encodedVal;
303
351
 
352
+ var urlParams = self.urlParams = {};
353
+ forEach(url.split(/\W/), function(param){
354
+ if (!(new RegExp("^\\d+$").test(param)) && param && (new RegExp("(^|[^\\\\]):" + param + "(\\W|$)").test(url))) {
355
+ urlParams[param] = true;
356
+ }
357
+ });
358
+ url = url.replace(/\\:/g, ':');
359
+
304
360
  params = params || {};
305
- forEach(this.urlParams, function(_, urlParam){
361
+ forEach(self.urlParams, function(_, urlParam){
306
362
  val = params.hasOwnProperty(urlParam) ? params[urlParam] : self.defaults[urlParam];
307
363
  if (angular.isDefined(val) && val !== null) {
308
364
  encodedVal = encodeUriSegment(val);
309
- url = url.replace(new RegExp(":" + urlParam + "(\\W)", "g"), encodedVal + "$1");
365
+ url = url.replace(new RegExp(":" + urlParam + "(\\W|$)", "g"), encodedVal + "$1");
310
366
  } else {
311
- url = url.replace(new RegExp("(\/?):" + urlParam + "(\\W)", "g"), function(match,
367
+ url = url.replace(new RegExp("(\/?):" + urlParam + "(\\W|$)", "g"), function(match,
312
368
  leadingSlashes, tail) {
313
369
  if (tail.charAt(0) == '/') {
314
370
  return tail;
@@ -318,16 +374,23 @@ angular.module('ngResource', ['ng']).
318
374
  });
319
375
  }
320
376
  });
321
- url = url.replace(/\/?#$/, '');
322
- var query = [];
377
+
378
+ // strip trailing slashes and set the url
379
+ url = url.replace(/\/+$/, '');
380
+ // then replace collapse `/.` if found in the last URL path segment before the query
381
+ // E.g. `http://url.com/id./format?q=x` becomes `http://url.com/id.format?q=x`
382
+ url = url.replace(/\/\.(?=\w+($|\?))/, '.');
383
+ // replace escaped `/\.` with `/.`
384
+ config.url = url.replace(/\/\\\./, '/.');
385
+
386
+
387
+ // set params - delegate param encoding to $http
323
388
  forEach(params, function(value, key){
324
389
  if (!self.urlParams[key]) {
325
- query.push(encodeUriQuery(key) + '=' + encodeUriQuery(value));
390
+ config.params = config.params || {};
391
+ config.params[key] = value;
326
392
  }
327
393
  });
328
- query.sort();
329
- url = url.replace(/\/*$/, '');
330
- return url + (query.length ? '?' + query.join('&') : '');
331
394
  }
332
395
  };
333
396
 
@@ -341,23 +404,26 @@ angular.module('ngResource', ['ng']).
341
404
  var ids = {};
342
405
  actionParams = extend({}, paramDefaults, actionParams);
343
406
  forEach(actionParams, function(value, key){
344
- ids[key] = value.charAt && value.charAt(0) == '@' ? getter(data, value.substr(1)) : value;
407
+ if (isFunction(value)) { value = value(); }
408
+ ids[key] = value && value.charAt && value.charAt(0) == '@' ? getter(data, value.substr(1)) : value;
345
409
  });
346
410
  return ids;
347
411
  }
348
412
 
413
+ function defaultResponseInterceptor(response) {
414
+ return response.resource;
415
+ }
416
+
349
417
  function Resource(value){
350
418
  copy(value || {}, this);
351
419
  }
352
420
 
353
421
  forEach(actions, function(action, name) {
354
- action.method = angular.uppercase(action.method);
355
- var hasBody = action.method == 'POST' || action.method == 'PUT' || action.method == 'PATCH';
422
+ var hasBody = /^(POST|PUT|PATCH)$/i.test(action.method);
423
+
356
424
  Resource[name] = function(a1, a2, a3, a4) {
357
- var params = {};
358
- var data;
359
- var success = noop;
360
- var error = null;
425
+ var params = {}, data, success, error;
426
+
361
427
  switch(arguments.length) {
362
428
  case 4:
363
429
  error = a4;
@@ -388,58 +454,83 @@ angular.module('ngResource', ['ng']).
388
454
  break;
389
455
  case 0: break;
390
456
  default:
391
- throw "Expected between 0-4 arguments [params, data, success, error], got " +
392
- arguments.length + " arguments.";
457
+ throw $resourceMinErr('badargs',
458
+ "Expected up to 4 arguments [params, data, success, error], got {0} arguments", arguments.length);
393
459
  }
394
460
 
395
- var value = this instanceof Resource ? this : (action.isArray ? [] : new Resource(data));
396
- $http({
397
- method: action.method,
398
- url: route.url(extend({}, extractParams(data, action.params || {}), params)),
399
- data: data
400
- }).then(function(response) {
401
- var data = response.data;
402
-
403
- if (data) {
404
- if (action.isArray) {
405
- value.length = 0;
406
- forEach(data, function(item) {
407
- value.push(new Resource(item));
408
- });
409
- } else {
410
- copy(data, value);
411
- }
412
- }
413
- (success||noop)(value, response.headers);
414
- }, error);
461
+ var isInstanceCall = data instanceof Resource;
462
+ var value = isInstanceCall ? data : (action.isArray ? [] : new Resource(data));
463
+ var httpConfig = {};
464
+ var responseInterceptor = action.interceptor && action.interceptor.response || defaultResponseInterceptor;
465
+ var responseErrorInterceptor = action.interceptor && action.interceptor.responseError || undefined;
415
466
 
416
- return value;
417
- };
467
+ forEach(action, function(value, key) {
468
+ if (key != 'params' && key != 'isArray' && key != 'interceptor') {
469
+ httpConfig[key] = copy(value);
470
+ }
471
+ });
418
472
 
473
+ httpConfig.data = data;
474
+ route.setUrlParams(httpConfig, extend({}, extractParams(data, action.params || {}), params), action.url);
419
475
 
420
- Resource.prototype['$' + name] = function(a1, a2, a3) {
421
- var params = extractParams(this),
422
- success = noop,
423
- error;
476
+ var promise = $http(httpConfig).then(function(response) {
477
+ var data = response.data,
478
+ promise = value.$promise;
424
479
 
425
- switch(arguments.length) {
426
- case 3: params = a1; success = a2; error = a3; break;
427
- case 2:
428
- case 1:
429
- if (isFunction(a1)) {
430
- success = a1;
431
- error = a2;
432
- } else {
433
- params = a1;
434
- success = a2 || noop;
480
+ if (data) {
481
+ if ( angular.isArray(data) != !!action.isArray ) {
482
+ throw $resourceMinErr('badcfg', 'Error in resource configuration. Expected response' +
483
+ ' to contain an {0} but got an {1}',
484
+ action.isArray?'array':'object', angular.isArray(data)?'array':'object');
485
+ }
486
+ if (action.isArray) {
487
+ value.length = 0;
488
+ forEach(data, function(item) {
489
+ value.push(new Resource(item));
490
+ });
491
+ } else {
492
+ copy(data, value);
493
+ value.$promise = promise;
494
+ }
435
495
  }
436
- case 0: break;
437
- default:
438
- throw "Expected between 1-3 arguments [params, success, error], got " +
439
- arguments.length + " arguments.";
496
+
497
+ value.$resolved = true;
498
+
499
+ (success||noop)(value, response.headers);
500
+
501
+ response.resource = value;
502
+
503
+ return response;
504
+ }, function(response) {
505
+ value.$resolved = true;
506
+
507
+ (error||noop)(response);
508
+
509
+ return $q.reject(response);
510
+ }).then(responseInterceptor, responseErrorInterceptor);
511
+
512
+
513
+ if (!isInstanceCall) {
514
+ // we are creating instance / collection
515
+ // - set the initial promise
516
+ // - return the instance / collection
517
+ value.$promise = promise;
518
+ value.$resolved = false;
519
+
520
+ return value;
521
+ }
522
+
523
+ // instance call
524
+ return promise;
525
+ };
526
+
527
+
528
+ Resource.prototype['$' + name] = function(params, success, error) {
529
+ if (isFunction(params)) {
530
+ error = success; success = params; params = {};
440
531
  }
441
- var data = hasBody ? this : undefined;
442
- Resource[name].call(this, params, data, success, error);
532
+ var result = Resource[name](params, this, success, error);
533
+ return result.$promise || result;
443
534
  };
444
535
  });
445
536
 
@@ -0,0 +1,860 @@
1
+ /**
2
+ * @license AngularJS v1.2.0rc1
3
+ * (c) 2010-2012 Google, Inc. http://angularjs.org
4
+ * License: MIT
5
+ */
6
+ (function(window, angular, undefined) {'use strict';
7
+
8
+ var copy = angular.copy,
9
+ equals = angular.equals,
10
+ extend = angular.extend,
11
+ forEach = angular.forEach,
12
+ isDefined = angular.isDefined,
13
+ isFunction = angular.isFunction,
14
+ isString = angular.isString,
15
+ jqLite = angular.element,
16
+ noop = angular.noop,
17
+ toJson = angular.toJson;
18
+
19
+
20
+ function inherit(parent, extra) {
21
+ return extend(new (extend(function() {}, {prototype:parent}))(), extra);
22
+ }
23
+
24
+ /**
25
+ * @ngdoc overview
26
+ * @name ngRoute
27
+ * @description
28
+ *
29
+ * Module that provides routing and deeplinking services and directives for angular apps.
30
+ */
31
+
32
+ var ngRouteModule = angular.module('ngRoute', ['ng']).
33
+ provider('$route', $RouteProvider);
34
+
35
+ /**
36
+ * @ngdoc object
37
+ * @name ngRoute.$routeProvider
38
+ * @function
39
+ *
40
+ * @description
41
+ *
42
+ * Used for configuring routes. See {@link ngRoute.$route $route} for an example.
43
+ */
44
+ function $RouteProvider(){
45
+ var routes = {};
46
+
47
+ /**
48
+ * @ngdoc method
49
+ * @name ngRoute.$routeProvider#when
50
+ * @methodOf ngRoute.$routeProvider
51
+ *
52
+ * @param {string} path Route path (matched against `$location.path`). If `$location.path`
53
+ * contains redundant trailing slash or is missing one, the route will still match and the
54
+ * `$location.path` will be updated to add or drop the trailing slash to exactly match the
55
+ * route definition.
56
+ *
57
+ * * `path` can contain named groups starting with a colon (`:name`). All characters up
58
+ * to the next slash are matched and stored in `$routeParams` under the given `name`
59
+ * when the route matches.
60
+ * * `path` can contain named groups starting with a colon and ending with a star (`:name*`).
61
+ * All characters are eagerly stored in `$routeParams` under the given `name`
62
+ * when the route matches.
63
+ * * `path` can contain optional named groups with a question mark (`:name?`).
64
+ *
65
+ * For example, routes like `/color/:color/largecode/:largecode*\/edit` will match
66
+ * `/color/brown/largecode/code/with/slashs/edit` and extract:
67
+ *
68
+ * * `color: brown`
69
+ * * `largecode: code/with/slashs`.
70
+ *
71
+ *
72
+ * @param {Object} route Mapping information to be assigned to `$route.current` on route
73
+ * match.
74
+ *
75
+ * Object properties:
76
+ *
77
+ * - `controller` – `{(string|function()=}` – Controller fn that should be associated with newly
78
+ * created scope or the name of a {@link angular.Module#controller registered controller}
79
+ * if passed as a string.
80
+ * - `controllerAs` – `{string=}` – A controller alias name. If present the controller will be
81
+ * published to scope under the `controllerAs` name.
82
+ * - `template` – `{string=|function()=}` – html template as a string or a function that
83
+ * returns an html template as a string which should be used by {@link
84
+ * ngRoute.directive:ngView ngView} or {@link ng.directive:ngInclude ngInclude} directives.
85
+ * This property takes precedence over `templateUrl`.
86
+ *
87
+ * If `template` is a function, it will be called with the following parameters:
88
+ *
89
+ * - `{Array.<Object>}` - route parameters extracted from the current
90
+ * `$location.path()` by applying the current route
91
+ *
92
+ * - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html
93
+ * template that should be used by {@link ngRoute.directive:ngView ngView}.
94
+ *
95
+ * If `templateUrl` is a function, it will be called with the following parameters:
96
+ *
97
+ * - `{Array.<Object>}` - route parameters extracted from the current
98
+ * `$location.path()` by applying the current route
99
+ *
100
+ * - `resolve` - `{Object.<string, function>=}` - An optional map of dependencies which should
101
+ * be injected into the controller. If any of these dependencies are promises, they will be
102
+ * resolved and converted to a value before the controller is instantiated and the
103
+ * `$routeChangeSuccess` event is fired. The map object is:
104
+ *
105
+ * - `key` – `{string}`: a name of a dependency to be injected into the controller.
106
+ * - `factory` - `{string|function}`: If `string` then it is an alias for a service.
107
+ * Otherwise if function, then it is {@link api/AUTO.$injector#invoke injected}
108
+ * and the return value is treated as the dependency. If the result is a promise, it is resolved
109
+ * before its value is injected into the controller. Be aware that `ngRoute.$routeParams` will
110
+ * still refer to the previous route within these resolve functions. Use `$route.current.params`
111
+ * to access the new route parameters, instead.
112
+ *
113
+ * - `redirectTo` – {(string|function())=} – value to update
114
+ * {@link ng.$location $location} path with and trigger route redirection.
115
+ *
116
+ * If `redirectTo` is a function, it will be called with the following parameters:
117
+ *
118
+ * - `{Object.<string>}` - route parameters extracted from the current
119
+ * `$location.path()` by applying the current route templateUrl.
120
+ * - `{string}` - current `$location.path()`
121
+ * - `{Object}` - current `$location.search()`
122
+ *
123
+ * The custom `redirectTo` function is expected to return a string which will be used
124
+ * to update `$location.path()` and `$location.search()`.
125
+ *
126
+ * - `[reloadOnSearch=true]` - {boolean=} - reload route when only $location.search()
127
+ * changes.
128
+ *
129
+ * If the option is set to `false` and url in the browser changes, then
130
+ * `$routeUpdate` event is broadcasted on the root scope.
131
+ *
132
+ * - `[caseInsensitiveMatch=false]` - {boolean=} - match routes without being case sensitive
133
+ *
134
+ * If the option is set to `true`, then the particular route can be matched without being
135
+ * case sensitive
136
+ *
137
+ * @returns {Object} self
138
+ *
139
+ * @description
140
+ * Adds a new route definition to the `$route` service.
141
+ */
142
+ this.when = function(path, route) {
143
+ routes[path] = extend(
144
+ {reloadOnSearch: true},
145
+ route,
146
+ path && pathRegExp(path, route)
147
+ );
148
+
149
+ // create redirection for trailing slashes
150
+ if (path) {
151
+ var redirectPath = (path[path.length-1] == '/')
152
+ ? path.substr(0, path.length-1)
153
+ : path +'/';
154
+
155
+ routes[redirectPath] = extend(
156
+ {redirectTo: path},
157
+ pathRegExp(redirectPath, route)
158
+ );
159
+ }
160
+
161
+ return this;
162
+ };
163
+
164
+ /**
165
+ * @param path {string} path
166
+ * @param opts {Object} options
167
+ * @return {?Object}
168
+ *
169
+ * @description
170
+ * Normalizes the given path, returning a regular expression
171
+ * and the original path.
172
+ *
173
+ * Inspired by pathRexp in visionmedia/express/lib/utils.js.
174
+ */
175
+ function pathRegExp(path, opts) {
176
+ var insensitive = opts.caseInsensitiveMatch,
177
+ ret = {
178
+ originalPath: path,
179
+ regexp: path
180
+ },
181
+ keys = ret.keys = [];
182
+
183
+ path = path
184
+ .replace(/([().])/g, '\\$1')
185
+ .replace(/(\/)?:(\w+)([\?|\*])?/g, function(_, slash, key, option){
186
+ var optional = option === '?' ? option : null;
187
+ var star = option === '*' ? option : null;
188
+ keys.push({ name: key, optional: !!optional });
189
+ slash = slash || '';
190
+ return ''
191
+ + (optional ? '' : slash)
192
+ + '(?:'
193
+ + (optional ? slash : '')
194
+ + (star && '(.+)?' || '([^/]+)?') + ')'
195
+ + (optional || '');
196
+ })
197
+ .replace(/([\/$\*])/g, '\\$1');
198
+
199
+ ret.regexp = new RegExp('^' + path + '$', insensitive ? 'i' : '');
200
+ return ret;
201
+ }
202
+
203
+ /**
204
+ * @ngdoc method
205
+ * @name ngRoute.$routeProvider#otherwise
206
+ * @methodOf ngRoute.$routeProvider
207
+ *
208
+ * @description
209
+ * Sets route definition that will be used on route change when no other route definition
210
+ * is matched.
211
+ *
212
+ * @param {Object} params Mapping information to be assigned to `$route.current`.
213
+ * @returns {Object} self
214
+ */
215
+ this.otherwise = function(params) {
216
+ this.when(null, params);
217
+ return this;
218
+ };
219
+
220
+
221
+ this.$get = ['$rootScope', '$location', '$routeParams', '$q', '$injector', '$http', '$templateCache', '$sce',
222
+ function( $rootScope, $location, $routeParams, $q, $injector, $http, $templateCache, $sce) {
223
+
224
+ /**
225
+ * @ngdoc object
226
+ * @name ngRoute.$route
227
+ * @requires $location
228
+ * @requires $routeParams
229
+ *
230
+ * @property {Object} current Reference to the current route definition.
231
+ * The route definition contains:
232
+ *
233
+ * - `controller`: The controller constructor as define in route definition.
234
+ * - `locals`: A map of locals which is used by {@link ng.$controller $controller} service for
235
+ * controller instantiation. The `locals` contain
236
+ * the resolved values of the `resolve` map. Additionally the `locals` also contain:
237
+ *
238
+ * - `$scope` - The current route scope.
239
+ * - `$template` - The current route template HTML.
240
+ *
241
+ * @property {Array.<Object>} routes Array of all configured routes.
242
+ *
243
+ * @description
244
+ * Is used for deep-linking URLs to controllers and views (HTML partials).
245
+ * It watches `$location.url()` and tries to map the path to an existing route definition.
246
+ *
247
+ * You can define routes through {@link ngRoute.$routeProvider $routeProvider}'s API.
248
+ *
249
+ * The `$route` service is typically used in conjunction with {@link ngRoute.directive:ngView ngView}
250
+ * directive and the {@link ngRoute.$routeParams $routeParams} service.
251
+ *
252
+ * @example
253
+ This example shows how changing the URL hash causes the `$route` to match a route against the
254
+ URL, and the `ngView` pulls in the partial.
255
+
256
+ Note that this example is using {@link ng.directive:script inlined templates}
257
+ to get it working on jsfiddle as well.
258
+
259
+ <example module="ngView" deps="angular-route.js">
260
+ <file name="index.html">
261
+ <div ng-controller="MainCntl">
262
+ Choose:
263
+ <a href="Book/Moby">Moby</a> |
264
+ <a href="Book/Moby/ch/1">Moby: Ch1</a> |
265
+ <a href="Book/Gatsby">Gatsby</a> |
266
+ <a href="Book/Gatsby/ch/4?key=value">Gatsby: Ch4</a> |
267
+ <a href="Book/Scarlet">Scarlet Letter</a><br/>
268
+
269
+ <div ng-view></div>
270
+ <hr />
271
+
272
+ <pre>$location.path() = {{$location.path()}}</pre>
273
+ <pre>$route.current.templateUrl = {{$route.current.templateUrl}}</pre>
274
+ <pre>$route.current.params = {{$route.current.params}}</pre>
275
+ <pre>$route.current.scope.name = {{$route.current.scope.name}}</pre>
276
+ <pre>$routeParams = {{$routeParams}}</pre>
277
+ </div>
278
+ </file>
279
+
280
+ <file name="book.html">
281
+ controller: {{name}}<br />
282
+ Book Id: {{params.bookId}}<br />
283
+ </file>
284
+
285
+ <file name="chapter.html">
286
+ controller: {{name}}<br />
287
+ Book Id: {{params.bookId}}<br />
288
+ Chapter Id: {{params.chapterId}}
289
+ </file>
290
+
291
+ <file name="script.js">
292
+ angular.module('ngView', ['ngRoute']).config(function($routeProvider, $locationProvider) {
293
+ $routeProvider.when('/Book/:bookId', {
294
+ templateUrl: 'book.html',
295
+ controller: BookCntl,
296
+ resolve: {
297
+ // I will cause a 1 second delay
298
+ delay: function($q, $timeout) {
299
+ var delay = $q.defer();
300
+ $timeout(delay.resolve, 1000);
301
+ return delay.promise;
302
+ }
303
+ }
304
+ });
305
+ $routeProvider.when('/Book/:bookId/ch/:chapterId', {
306
+ templateUrl: 'chapter.html',
307
+ controller: ChapterCntl
308
+ });
309
+
310
+ // configure html5 to get links working on jsfiddle
311
+ $locationProvider.html5Mode(true);
312
+ });
313
+
314
+ function MainCntl($scope, $route, $routeParams, $location) {
315
+ $scope.$route = $route;
316
+ $scope.$location = $location;
317
+ $scope.$routeParams = $routeParams;
318
+ }
319
+
320
+ function BookCntl($scope, $routeParams) {
321
+ $scope.name = "BookCntl";
322
+ $scope.params = $routeParams;
323
+ }
324
+
325
+ function ChapterCntl($scope, $routeParams) {
326
+ $scope.name = "ChapterCntl";
327
+ $scope.params = $routeParams;
328
+ }
329
+ </file>
330
+
331
+ <file name="scenario.js">
332
+ it('should load and compile correct template', function() {
333
+ element('a:contains("Moby: Ch1")').click();
334
+ var content = element('.doc-example-live [ng-view]').text();
335
+ expect(content).toMatch(/controller\: ChapterCntl/);
336
+ expect(content).toMatch(/Book Id\: Moby/);
337
+ expect(content).toMatch(/Chapter Id\: 1/);
338
+
339
+ element('a:contains("Scarlet")').click();
340
+ sleep(2); // promises are not part of scenario waiting
341
+ content = element('.doc-example-live [ng-view]').text();
342
+ expect(content).toMatch(/controller\: BookCntl/);
343
+ expect(content).toMatch(/Book Id\: Scarlet/);
344
+ });
345
+ </file>
346
+ </example>
347
+ */
348
+
349
+ /**
350
+ * @ngdoc event
351
+ * @name ngRoute.$route#$routeChangeStart
352
+ * @eventOf ngRoute.$route
353
+ * @eventType broadcast on root scope
354
+ * @description
355
+ * Broadcasted before a route change. At this point the route services starts
356
+ * resolving all of the dependencies needed for the route change to occurs.
357
+ * Typically this involves fetching the view template as well as any dependencies
358
+ * defined in `resolve` route property. Once all of the dependencies are resolved
359
+ * `$routeChangeSuccess` is fired.
360
+ *
361
+ * @param {Route} next Future route information.
362
+ * @param {Route} current Current route information.
363
+ */
364
+
365
+ /**
366
+ * @ngdoc event
367
+ * @name ngRoute.$route#$routeChangeSuccess
368
+ * @eventOf ngRoute.$route
369
+ * @eventType broadcast on root scope
370
+ * @description
371
+ * Broadcasted after a route dependencies are resolved.
372
+ * {@link ngRoute.directive:ngView ngView} listens for the directive
373
+ * to instantiate the controller and render the view.
374
+ *
375
+ * @param {Object} angularEvent Synthetic event object.
376
+ * @param {Route} current Current route information.
377
+ * @param {Route|Undefined} previous Previous route information, or undefined if current is first route entered.
378
+ */
379
+
380
+ /**
381
+ * @ngdoc event
382
+ * @name ngRoute.$route#$routeChangeError
383
+ * @eventOf ngRoute.$route
384
+ * @eventType broadcast on root scope
385
+ * @description
386
+ * Broadcasted if any of the resolve promises are rejected.
387
+ *
388
+ * @param {Route} current Current route information.
389
+ * @param {Route} previous Previous route information.
390
+ * @param {Route} rejection Rejection of the promise. Usually the error of the failed promise.
391
+ */
392
+
393
+ /**
394
+ * @ngdoc event
395
+ * @name ngRoute.$route#$routeUpdate
396
+ * @eventOf ngRoute.$route
397
+ * @eventType broadcast on root scope
398
+ * @description
399
+ *
400
+ * The `reloadOnSearch` property has been set to false, and we are reusing the same
401
+ * instance of the Controller.
402
+ */
403
+
404
+ var forceReload = false,
405
+ $route = {
406
+ routes: routes,
407
+
408
+ /**
409
+ * @ngdoc method
410
+ * @name ngRoute.$route#reload
411
+ * @methodOf ngRoute.$route
412
+ *
413
+ * @description
414
+ * Causes `$route` service to reload the current route even if
415
+ * {@link ng.$location $location} hasn't changed.
416
+ *
417
+ * As a result of that, {@link ngRoute.directive:ngView ngView}
418
+ * creates new scope, reinstantiates the controller.
419
+ */
420
+ reload: function() {
421
+ forceReload = true;
422
+ $rootScope.$evalAsync(updateRoute);
423
+ }
424
+ };
425
+
426
+ $rootScope.$on('$locationChangeSuccess', updateRoute);
427
+
428
+ return $route;
429
+
430
+ /////////////////////////////////////////////////////
431
+
432
+ /**
433
+ * @param on {string} current url
434
+ * @param route {Object} route regexp to match the url against
435
+ * @return {?Object}
436
+ *
437
+ * @description
438
+ * Check if the route matches the current url.
439
+ *
440
+ * Inspired by match in
441
+ * visionmedia/express/lib/router/router.js.
442
+ */
443
+ function switchRouteMatcher(on, route) {
444
+ var keys = route.keys,
445
+ params = {};
446
+
447
+ if (!route.regexp) return null;
448
+
449
+ var m = route.regexp.exec(on);
450
+ if (!m) return null;
451
+
452
+ var N = 0;
453
+ for (var i = 1, len = m.length; i < len; ++i) {
454
+ var key = keys[i - 1];
455
+
456
+ var val = 'string' == typeof m[i]
457
+ ? decodeURIComponent(m[i])
458
+ : m[i];
459
+
460
+ if (key && val) {
461
+ params[key.name] = val;
462
+ }
463
+ }
464
+ return params;
465
+ }
466
+
467
+ function updateRoute() {
468
+ var next = parseRoute(),
469
+ last = $route.current;
470
+
471
+ if (next && last && next.$$route === last.$$route
472
+ && equals(next.pathParams, last.pathParams) && !next.reloadOnSearch && !forceReload) {
473
+ last.params = next.params;
474
+ copy(last.params, $routeParams);
475
+ $rootScope.$broadcast('$routeUpdate', last);
476
+ } else if (next || last) {
477
+ forceReload = false;
478
+ $rootScope.$broadcast('$routeChangeStart', next, last);
479
+ $route.current = next;
480
+ if (next) {
481
+ if (next.redirectTo) {
482
+ if (isString(next.redirectTo)) {
483
+ $location.path(interpolate(next.redirectTo, next.params)).search(next.params)
484
+ .replace();
485
+ } else {
486
+ $location.url(next.redirectTo(next.pathParams, $location.path(), $location.search()))
487
+ .replace();
488
+ }
489
+ }
490
+ }
491
+
492
+ $q.when(next).
493
+ then(function() {
494
+ if (next) {
495
+ var locals = extend({}, next.resolve),
496
+ template, templateUrl;
497
+
498
+ forEach(locals, function(value, key) {
499
+ locals[key] = isString(value) ? $injector.get(value) : $injector.invoke(value);
500
+ });
501
+
502
+ if (isDefined(template = next.template)) {
503
+ if (isFunction(template)) {
504
+ template = template(next.params);
505
+ }
506
+ } else if (isDefined(templateUrl = next.templateUrl)) {
507
+ if (isFunction(templateUrl)) {
508
+ templateUrl = templateUrl(next.params);
509
+ }
510
+ templateUrl = $sce.getTrustedResourceUrl(templateUrl);
511
+ if (isDefined(templateUrl)) {
512
+ next.loadedTemplateUrl = templateUrl;
513
+ template = $http.get(templateUrl, {cache: $templateCache}).
514
+ then(function(response) { return response.data; });
515
+ }
516
+ }
517
+ if (isDefined(template)) {
518
+ locals['$template'] = template;
519
+ }
520
+ return $q.all(locals);
521
+ }
522
+ }).
523
+ // after route change
524
+ then(function(locals) {
525
+ if (next == $route.current) {
526
+ if (next) {
527
+ next.locals = locals;
528
+ copy(next.params, $routeParams);
529
+ }
530
+ $rootScope.$broadcast('$routeChangeSuccess', next, last);
531
+ }
532
+ }, function(error) {
533
+ if (next == $route.current) {
534
+ $rootScope.$broadcast('$routeChangeError', next, last, error);
535
+ }
536
+ });
537
+ }
538
+ }
539
+
540
+
541
+ /**
542
+ * @returns the current active route, by matching it against the URL
543
+ */
544
+ function parseRoute() {
545
+ // Match a route
546
+ var params, match;
547
+ forEach(routes, function(route, path) {
548
+ if (!match && (params = switchRouteMatcher($location.path(), route))) {
549
+ match = inherit(route, {
550
+ params: extend({}, $location.search(), params),
551
+ pathParams: params});
552
+ match.$$route = route;
553
+ }
554
+ });
555
+ // No route matched; fallback to "otherwise" route
556
+ return match || routes[null] && inherit(routes[null], {params: {}, pathParams:{}});
557
+ }
558
+
559
+ /**
560
+ * @returns interpolation of the redirect path with the parameters
561
+ */
562
+ function interpolate(string, params) {
563
+ var result = [];
564
+ forEach((string||'').split(':'), function(segment, i) {
565
+ if (i == 0) {
566
+ result.push(segment);
567
+ } else {
568
+ var segmentMatch = segment.match(/(\w+)(.*)/);
569
+ var key = segmentMatch[1];
570
+ result.push(params[key]);
571
+ result.push(segmentMatch[2] || '');
572
+ delete params[key];
573
+ }
574
+ });
575
+ return result.join('');
576
+ }
577
+ }];
578
+ }
579
+
580
+ ngRouteModule.provider('$routeParams', $RouteParamsProvider);
581
+
582
+
583
+ /**
584
+ * @ngdoc object
585
+ * @name ngRoute.$routeParams
586
+ * @requires $route
587
+ *
588
+ * @description
589
+ * Current set of route parameters. The route parameters are a combination of the
590
+ * {@link ng.$location $location} `search()`, and `path()`. The `path` parameters
591
+ * are extracted when the {@link ngRoute.$route $route} path is matched.
592
+ *
593
+ * In case of parameter name collision, `path` params take precedence over `search` params.
594
+ *
595
+ * The service guarantees that the identity of the `$routeParams` object will remain unchanged
596
+ * (but its properties will likely change) even when a route change occurs.
597
+ *
598
+ * Note that the `$routeParams` are only updated *after* a route change completes successfully.
599
+ * This means that you cannot rely on `$routeParams` being correct in route resolve functions.
600
+ * Instead you can use `$route.current.params` to access the new route's parameters.
601
+ *
602
+ * @example
603
+ * <pre>
604
+ * // Given:
605
+ * // URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby
606
+ * // Route: /Chapter/:chapterId/Section/:sectionId
607
+ * //
608
+ * // Then
609
+ * $routeParams ==> {chapterId:1, sectionId:2, search:'moby'}
610
+ * </pre>
611
+ */
612
+ function $RouteParamsProvider() {
613
+ this.$get = function() { return {}; };
614
+ }
615
+
616
+ /**
617
+ * @ngdoc directive
618
+ * @name ngRoute.directive:ngView
619
+ * @restrict ECA
620
+ *
621
+ * @description
622
+ * # Overview
623
+ * `ngView` is a directive that complements the {@link ngRoute.$route $route} service by
624
+ * including the rendered template of the current route into the main layout (`index.html`) file.
625
+ * Every time the current route changes, the included view changes with it according to the
626
+ * configuration of the `$route` service.
627
+ *
628
+ * @animations
629
+ * enter - animation is used to bring new content into the browser.
630
+ * leave - animation is used to animate existing content away.
631
+ *
632
+ * The enter and leave animation occur concurrently.
633
+ *
634
+ * @scope
635
+ * @example
636
+ <example module="ngViewExample" deps="angular-route.js" animations="true">
637
+ <file name="index.html">
638
+ <div ng-controller="MainCntl as main">
639
+ Choose:
640
+ <a href="Book/Moby">Moby</a> |
641
+ <a href="Book/Moby/ch/1">Moby: Ch1</a> |
642
+ <a href="Book/Gatsby">Gatsby</a> |
643
+ <a href="Book/Gatsby/ch/4?key=value">Gatsby: Ch4</a> |
644
+ <a href="Book/Scarlet">Scarlet Letter</a><br/>
645
+
646
+ <div class="example-animate-container">
647
+ <div ng-view class="view-example"></div>
648
+ </div>
649
+ <hr />
650
+
651
+ <pre>$location.path() = {{main.$location.path()}}</pre>
652
+ <pre>$route.current.templateUrl = {{main.$route.current.templateUrl}}</pre>
653
+ <pre>$route.current.params = {{main.$route.current.params}}</pre>
654
+ <pre>$route.current.scope.name = {{main.$route.current.scope.name}}</pre>
655
+ <pre>$routeParams = {{main.$routeParams}}</pre>
656
+ </div>
657
+ </file>
658
+
659
+ <file name="book.html">
660
+ <div>
661
+ controller: {{book.name}}<br />
662
+ Book Id: {{book.params.bookId}}<br />
663
+ </div>
664
+ </file>
665
+
666
+ <file name="chapter.html">
667
+ <div>
668
+ controller: {{chapter.name}}<br />
669
+ Book Id: {{chapter.params.bookId}}<br />
670
+ Chapter Id: {{chapter.params.chapterId}}
671
+ </div>
672
+ </file>
673
+
674
+ <file name="animations.css">
675
+ .example-animate-container {
676
+ position:relative;
677
+ background:white;
678
+ border:1px solid black;
679
+ height:40px;
680
+ overflow:hidden;
681
+ }
682
+
683
+ .example-animate-container > div {
684
+ padding:10px;
685
+ }
686
+
687
+ .view-example.ng-enter, .view-example.ng-leave {
688
+ -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;
689
+ -moz-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;
690
+ -o-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;
691
+ transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;
692
+
693
+ display:block;
694
+ width:100%;
695
+ border-left:1px solid black;
696
+
697
+ position:absolute;
698
+ top:0;
699
+ left:0;
700
+ right:0;
701
+ bottom:0;
702
+ padding:10px;
703
+ }
704
+
705
+ .example-animate-container {
706
+ position:relative;
707
+ height:100px;
708
+ }
709
+
710
+ .view-example.ng-enter {
711
+ left:100%;
712
+ }
713
+ .view-example.ng-enter.ng-enter-active {
714
+ left:0;
715
+ }
716
+
717
+ .view-example.ng-leave { }
718
+ .view-example.ng-leave.ng-leave-active {
719
+ left:-100%;
720
+ }
721
+ </file>
722
+
723
+ <file name="script.js">
724
+ angular.module('ngViewExample', ['ngRoute', 'ngAnimate'], function($routeProvider, $locationProvider) {
725
+ $routeProvider.when('/Book/:bookId', {
726
+ templateUrl: 'book.html',
727
+ controller: BookCntl,
728
+ controllerAs: 'book'
729
+ });
730
+ $routeProvider.when('/Book/:bookId/ch/:chapterId', {
731
+ templateUrl: 'chapter.html',
732
+ controller: ChapterCntl,
733
+ controllerAs: 'chapter'
734
+ });
735
+
736
+ // configure html5 to get links working on jsfiddle
737
+ $locationProvider.html5Mode(true);
738
+ });
739
+
740
+ function MainCntl($route, $routeParams, $location) {
741
+ this.$route = $route;
742
+ this.$location = $location;
743
+ this.$routeParams = $routeParams;
744
+ }
745
+
746
+ function BookCntl($routeParams) {
747
+ this.name = "BookCntl";
748
+ this.params = $routeParams;
749
+ }
750
+
751
+ function ChapterCntl($routeParams) {
752
+ this.name = "ChapterCntl";
753
+ this.params = $routeParams;
754
+ }
755
+ </file>
756
+
757
+ <file name="scenario.js">
758
+ it('should load and compile correct template', function() {
759
+ element('a:contains("Moby: Ch1")').click();
760
+ var content = element('.doc-example-live [ng-view]').text();
761
+ expect(content).toMatch(/controller\: ChapterCntl/);
762
+ expect(content).toMatch(/Book Id\: Moby/);
763
+ expect(content).toMatch(/Chapter Id\: 1/);
764
+
765
+ element('a:contains("Scarlet")').click();
766
+ content = element('.doc-example-live [ng-view]').text();
767
+ expect(content).toMatch(/controller\: BookCntl/);
768
+ expect(content).toMatch(/Book Id\: Scarlet/);
769
+ });
770
+ </file>
771
+ </example>
772
+ */
773
+
774
+
775
+ /**
776
+ * @ngdoc event
777
+ * @name ngRoute.directive:ngView#$viewContentLoaded
778
+ * @eventOf ngRoute.directive:ngView
779
+ * @eventType emit on the current ngView scope
780
+ * @description
781
+ * Emitted every time the ngView content is reloaded.
782
+ */
783
+ var NG_VIEW_PRIORITY = 500;
784
+ var ngViewDirective = ['$route', '$anchorScroll', '$compile', '$controller', '$animate',
785
+ function($route, $anchorScroll, $compile, $controller, $animate) {
786
+ return {
787
+ restrict: 'ECA',
788
+ terminal: true,
789
+ priority: NG_VIEW_PRIORITY,
790
+ compile: function(element, attr) {
791
+ var onloadExp = attr.onload || '';
792
+
793
+ element.html('');
794
+ var anchor = jqLite(document.createComment(' ngView '));
795
+ element.replaceWith(anchor);
796
+
797
+ return function(scope) {
798
+ var currentScope, currentElement;
799
+
800
+ scope.$on('$routeChangeSuccess', update);
801
+ update();
802
+
803
+ function cleanupLastView() {
804
+ if (currentScope) {
805
+ currentScope.$destroy();
806
+ currentScope = null;
807
+ }
808
+ if(currentElement) {
809
+ $animate.leave(currentElement);
810
+ currentElement = null;
811
+ }
812
+ }
813
+
814
+ function update() {
815
+ var locals = $route.current && $route.current.locals,
816
+ template = locals && locals.$template;
817
+
818
+ if (template) {
819
+ cleanupLastView();
820
+
821
+ currentScope = scope.$new();
822
+ currentElement = element.clone();
823
+ currentElement.html(template);
824
+ $animate.enter(currentElement, null, anchor);
825
+
826
+ var link = $compile(currentElement, false, NG_VIEW_PRIORITY - 1),
827
+ current = $route.current;
828
+
829
+ if (current.controller) {
830
+ locals.$scope = currentScope;
831
+ var controller = $controller(current.controller, locals);
832
+ if (current.controllerAs) {
833
+ currentScope[current.controllerAs] = controller;
834
+ }
835
+ currentElement.data('$ngControllerController', controller);
836
+ currentElement.children().data('$ngControllerController', controller);
837
+ }
838
+
839
+ current.scope = currentScope;
840
+
841
+ link(currentScope);
842
+
843
+ currentScope.$emit('$viewContentLoaded');
844
+ currentScope.$eval(onloadExp);
845
+
846
+ // $anchorScroll might listen on event...
847
+ $anchorScroll();
848
+ } else {
849
+ cleanupLastView();
850
+ }
851
+ }
852
+ }
853
+ }
854
+ };
855
+ }];
856
+
857
+ ngRouteModule.directive('ngView', ngViewDirective);
858
+
859
+
860
+ })(window, window.angular);