angularjs-rails 1.0.8 → 1.2.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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);