angular-rails-engine 1.2.0.0 → 1.2.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.md +1 -1
  5. data/app/assets/javascripts/angular/angular-animate.js +837 -288
  6. data/app/assets/javascripts/angular/angular-animate.min.js +17 -10
  7. data/app/assets/javascripts/angular/angular-animate.min.js.map +8 -0
  8. data/app/assets/javascripts/angular/angular-cookies.js +20 -2
  9. data/app/assets/javascripts/angular/angular-cookies.min.js +2 -4
  10. data/app/assets/javascripts/angular/angular-cookies.min.js.map +8 -0
  11. data/app/assets/javascripts/angular/angular-loader.js +31 -19
  12. data/app/assets/javascripts/angular/angular-loader.min.js +4 -6
  13. data/app/assets/javascripts/angular/angular-loader.min.js.map +8 -0
  14. data/app/assets/javascripts/angular/angular-mocks.js +263 -85
  15. data/app/assets/javascripts/angular/angular-resource.js +125 -95
  16. data/app/assets/javascripts/angular/angular-resource.min.js +8 -10
  17. data/app/assets/javascripts/angular/angular-resource.min.js.map +8 -0
  18. data/app/assets/javascripts/angular/angular-route.js +161 -141
  19. data/app/assets/javascripts/angular/angular-route.min.js +10 -11
  20. data/app/assets/javascripts/angular/angular-route.min.js.map +8 -0
  21. data/app/assets/javascripts/angular/angular-sanitize.js +135 -116
  22. data/app/assets/javascripts/angular/angular-sanitize.min.js +10 -11
  23. data/app/assets/javascripts/angular/angular-sanitize.min.js.map +8 -0
  24. data/app/assets/javascripts/angular/angular-scenario.js +13909 -11404
  25. data/app/assets/javascripts/angular/angular-touch.js +47 -20
  26. data/app/assets/javascripts/angular/angular-touch.min.js +9 -10
  27. data/app/assets/javascripts/angular/angular-touch.min.js.map +8 -0
  28. data/app/assets/javascripts/angular/angular.js +4407 -2278
  29. data/app/assets/javascripts/angular/angular.min.js +196 -181
  30. data/app/assets/javascripts/angular/angular.min.js.map +8 -0
  31. data/app/assets/stylesheets/angular-csp.css +24 -0
  32. data/lib/angular-rails-engine.rb +1 -1
  33. data/lib/angular-rails-engine/version.rb +1 -1
  34. metadata +11 -2
  35. metadata.gz.sig +0 -0
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.0rc1
2
+ * @license AngularJS v1.2.0
3
3
  * (c) 2010-2012 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -11,6 +11,17 @@ var $resourceMinErr = angular.$$minErr('$resource');
11
11
  * @ngdoc overview
12
12
  * @name ngResource
13
13
  * @description
14
+ *
15
+ * # ngResource
16
+ *
17
+ * The `ngResource` module provides interaction support with RESTful services
18
+ * via the $resource service.
19
+ *
20
+ * {@installModule resource}
21
+ *
22
+ * <div doc-module-components="ngResource"></div>
23
+ *
24
+ * See {@link ngResource.$resource `$resource`} for usage.
14
25
  */
15
26
 
16
27
  /**
@@ -25,23 +36,14 @@ var $resourceMinErr = angular.$$minErr('$resource');
25
36
  * The returned resource object has action methods which provide high-level behaviors without
26
37
  * the need to interact with the low level {@link ng.$http $http} service.
27
38
  *
28
- * # Installation
29
- * To use $resource make sure you have included the `angular-resource.js` that comes in Angular
30
- * package. You can also find this file on Google CDN, bower as well as at
31
- * {@link http://code.angularjs.org/ code.angularjs.org}.
32
- *
33
- * Finally load the module in your application:
34
- *
35
- * angular.module('app', ['ngResource']);
36
- *
37
- * and you are ready to get started!
39
+ * Requires the {@link ngResource `ngResource`} module to be installed.
38
40
  *
39
41
  * @param {string} url A parametrized URL template with parameters prefixed by `:` as in
40
42
  * `/user/:username`. If you are using a URL with a port number (e.g.
41
43
  * `http://example.com:8080/api`), it will be respected.
42
44
  *
43
45
  * 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')
46
+ * `$resource('http://example.com/resource.json')` or `$resource('http://example.com/:id.json')`
45
47
  * or even `$resource('http://example.com/resource/:resource_id.:format')`
46
48
  * If the parameter before the suffix is empty, :resource_id in this case, then the `/.` will be
47
49
  * collapsed down to a single `.`. If you need this sequence to appear and not collapse then you
@@ -62,7 +64,7 @@ var $resourceMinErr = angular.$$minErr('$resource');
62
64
  *
63
65
  * @param {Object.<Object>=} actions Hash with declaration of custom action that should extend the
64
66
  * default set of resource actions. The declaration should be created in the format of {@link
65
- * ng.$http#Parameters $http.config}:
67
+ * ng.$http#usage_parameters $http.config}:
66
68
  *
67
69
  * {action1: {method:?, params:?, isArray:?, headers:?, ...},
68
70
  * action2: {method:?, params:?, isArray:?, headers:?, ...},
@@ -70,21 +72,23 @@ var $resourceMinErr = angular.$$minErr('$resource');
70
72
  *
71
73
  * Where:
72
74
  *
73
- * - **`action`** – {string} – The name of action. This name becomes the name of the method on your
74
- * resource object.
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
83
- * `returns` section.
84
- * - **`transformRequest`** – `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
75
+ * - **`action`** – {string} – The name of action. This name becomes the name of the method on
76
+ * your resource object.
77
+ * - **`method`** – {string} – HTTP request method. Valid methods are: `GET`, `POST`, `PUT`,
78
+ * `DELETE`, and `JSONP`.
79
+ * - **`params`** – {Object=} – Optional set of pre-bound parameters for this action. If any of
80
+ * the parameter value is a function, it will be executed every time when a param value needs to
81
+ * be obtained for a request (unless the param was overridden).
82
+ * - **`url`** – {string} – action specific `url` override. The url templating is supported just
83
+ * like for the resource-level urls.
84
+ * - **`isArray`** – {boolean=} – If true then the returned object for this action is an array,
85
+ * see `returns` section.
86
+ * - **`transformRequest`** –
87
+ * `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
85
88
  * transform function or an array of such functions. The transform function takes the http
86
89
  * request body and headers and returns its transformed (typically serialized) version.
87
- * - **`transformResponse`** – `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
90
+ * - **`transformResponse`** –
91
+ * `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
88
92
  * transform function or an array of such functions. The transform function takes the http
89
93
  * response body and headers and returns its transformed (typically deserialized) version.
90
94
  * - **`cache`** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the
@@ -93,7 +97,7 @@ var $resourceMinErr = angular.$$minErr('$resource');
93
97
  * caching.
94
98
  * - **`timeout`** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise} that
95
99
  * should abort the request when resolved.
96
- * - **`withCredentials`** - `{boolean}` - whether to to set the `withCredentials` flag on the
100
+ * - **`withCredentials`** - `{boolean}` - whether to set the `withCredentials` flag on the
97
101
  * XHR object. See {@link https://developer.mozilla.org/en/http_access_control#section_5
98
102
  * requests with credentials} for more information.
99
103
  * - **`responseType`** - `{string}` - see {@link
@@ -152,14 +156,15 @@ var $resourceMinErr = angular.$$minErr('$resource');
152
156
  *
153
157
  * On success, the promise is resolved with the same resource instance or collection object,
154
158
  * 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.
159
+ * {@link ngRoute.$routeProvider resolve section of $routeProvider.when()} to defer view
160
+ * rendering until the resource(s) are loaded.
157
161
  *
158
- * On failure, the promise is resolved with the {@link ng.$http http response} object,
159
- * without the `resource` property.
162
+ * On failure, the promise is resolved with the {@link ng.$http http response} object, without
163
+ * the `resource` property.
160
164
  *
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.
165
+ * - `$resolved`: `true` after first server interaction is completed (either with success or
166
+ * rejection), `false` before that. Knowing if the Resource has been resolved is useful in
167
+ * data-binding.
163
168
  *
164
169
  * @example
165
170
  *
@@ -203,7 +208,8 @@ var $resourceMinErr = angular.$$minErr('$resource');
203
208
  * The object returned from this function execution is a resource "class" which has "static" method
204
209
  * for each action in the definition.
205
210
  *
206
- * Calling these methods invoke `$http` on the `url` template with the given `method`, `params` and `headers`.
211
+ * Calling these methods invoke `$http` on the `url` template with the given `method`, `params` and
212
+ * `headers`.
207
213
  * When the data is returned from the server then the object is an instance of the resource type and
208
214
  * all of the non-GET methods are available with `$` prefix. This allows you to easily support CRUD
209
215
  * operations (create, read, update, delete) on server-side data.
@@ -216,7 +222,7 @@ var $resourceMinErr = angular.$$minErr('$resource');
216
222
  });
217
223
  </pre>
218
224
  *
219
- * It's worth noting that the success callback for `get`, `query` and other method gets passed
225
+ * It's worth noting that the success callback for `get`, `query` and other methods gets passed
220
226
  * in the response that came from the server as well as $http header getter function, so one
221
227
  * could rewrite the above example and get access to http headers as:
222
228
  *
@@ -235,48 +241,52 @@ var $resourceMinErr = angular.$$minErr('$resource');
235
241
 
236
242
  Let's look at what a buzz client created with the `$resource` service looks like:
237
243
  <doc:example>
238
- <doc:source jsfiddle="false">
239
- <script>
240
- function BuzzController($resource) {
241
- this.userId = 'googlebuzz';
242
- this.Activity = $resource(
243
- 'https://www.googleapis.com/buzz/v1/activities/:userId/:visibility/:activityId/:comments',
244
- {alt:'json', callback:'JSON_CALLBACK'},
245
- {get:{method:'JSONP', params:{visibility:'@self'}}, replies: {method:'JSONP', params:{visibility:'@self', comments:'@comments'}}}
246
- );
244
+ <doc:source jsfiddle="false">
245
+ <script>
246
+ function BuzzController($resource) {
247
+ this.userId = 'googlebuzz';
248
+ this.Activity = $resource(
249
+ 'https://www.googleapis.com/buzz/v1/activities/:userId/:visibility/:activityId/:comments',
250
+ {alt:'json', callback:'JSON_CALLBACK'},
251
+ {
252
+ get:{method:'JSONP', params:{visibility:'@self'}},
253
+ replies: {method:'JSONP', params:{visibility:'@self', comments:'@comments'}}
247
254
  }
248
-
249
- BuzzController.prototype = {
250
- fetch: function() {
251
- this.activities = this.Activity.get({userId:this.userId});
252
- },
253
- expandReplies: function(activity) {
254
- activity.replies = this.Activity.replies({userId:this.userId, activityId:activity.id});
255
- }
256
- };
257
- BuzzController.$inject = ['$resource'];
258
- </script>
259
-
260
- <div ng-controller="BuzzController">
261
- <input ng-model="userId"/>
262
- <button ng-click="fetch()">fetch</button>
263
- <hr/>
264
- <div ng-repeat="item in activities.data.items">
265
- <h1 style="font-size: 15px;">
266
- <img src="{{item.actor.thumbnailUrl}}" style="max-height:30px;max-width:30px;"/>
267
- <a href="{{item.actor.profileUrl}}">{{item.actor.name}}</a>
268
- <a href ng-click="expandReplies(item)" style="float: right;">Expand replies: {{item.links.replies[0].count}}</a>
269
- </h1>
270
- {{item.object.content | html}}
271
- <div ng-repeat="reply in item.replies.data.items" style="margin-left: 20px;">
272
- <img src="{{reply.actor.thumbnailUrl}}" style="max-height:30px;max-width:30px;"/>
273
- <a href="{{reply.actor.profileUrl}}">{{reply.actor.name}}</a>: {{reply.content | html}}
274
- </div>
275
- </div>
255
+ );
256
+ }
257
+
258
+ BuzzController.prototype = {
259
+ fetch: function() {
260
+ this.activities = this.Activity.get({userId:this.userId});
261
+ },
262
+ expandReplies: function(activity) {
263
+ activity.replies = this.Activity.replies({userId:this.userId, activityId:activity.id});
264
+ }
265
+ };
266
+ BuzzController.$inject = ['$resource'];
267
+ </script>
268
+
269
+ <div ng-controller="BuzzController">
270
+ <input ng-model="userId"/>
271
+ <button ng-click="fetch()">fetch</button>
272
+ <hr/>
273
+ <div ng-repeat="item in activities.data.items">
274
+ <h1 style="font-size: 15px;">
275
+ <img src="{{item.actor.thumbnailUrl}}" style="max-height:30px;max-width:30px;"/>
276
+ <a href="{{item.actor.profileUrl}}">{{item.actor.name}}</a>
277
+ <a href ng-click="expandReplies(item)" style="float: right;">Expand replies:
278
+ {{item.links.replies[0].count}}</a>
279
+ </h1>
280
+ {{item.object.content | html}}
281
+ <div ng-repeat="reply in item.replies.data.items" style="margin-left: 20px;">
282
+ <img src="{{reply.actor.thumbnailUrl}}" style="max-height:30px;max-width:30px;"/>
283
+ <a href="{{reply.actor.profileUrl}}">{{reply.actor.name}}</a>: {{reply.content | html}}
276
284
  </div>
277
- </doc:source>
278
- <doc:scenario>
279
- </doc:scenario>
285
+ </div>
286
+ </div>
287
+ </doc:source>
288
+ <doc:scenario>
289
+ </doc:scenario>
280
290
  </doc:example>
281
291
  */
282
292
  angular.module('ngResource', ['ng']).
@@ -317,9 +327,9 @@ angular.module('ngResource', ['ng']).
317
327
 
318
328
 
319
329
  /**
320
- * This method is intended for encoding *key* or *value* parts of query component. We need a custom
321
- * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be
322
- * encoded per http://tools.ietf.org/html/rfc3986:
330
+ * This method is intended for encoding *key* or *value* parts of query component. We need a
331
+ * custom method because encodeURIComponent is too aggressive and encodes stuff that doesn't
332
+ * have to be encoded per http://tools.ietf.org/html/rfc3986:
323
333
  * query = *( pchar / "/" / "?" )
324
334
  * pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
325
335
  * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
@@ -351,8 +361,12 @@ angular.module('ngResource', ['ng']).
351
361
 
352
362
  var urlParams = self.urlParams = {};
353
363
  forEach(url.split(/\W/), function(param){
354
- if (!(new RegExp("^\\d+$").test(param)) && param && (new RegExp("(^|[^\\\\]):" + param + "(\\W|$)").test(url))) {
355
- urlParams[param] = true;
364
+ if (param === 'hasOwnProperty') {
365
+ throw $resourceMinErr('badname', "hasOwnProperty is not a valid parameter name.");
366
+ }
367
+ if (!(new RegExp("^\\d+$").test(param)) && param &&
368
+ (new RegExp("(^|[^\\\\]):" + param + "(\\W|$)").test(url))) {
369
+ urlParams[param] = true;
356
370
  }
357
371
  });
358
372
  url = url.replace(/\\:/g, ':');
@@ -395,7 +409,7 @@ angular.module('ngResource', ['ng']).
395
409
  };
396
410
 
397
411
 
398
- function ResourceFactory(url, paramDefaults, actions) {
412
+ function resourceFactory(url, paramDefaults, actions) {
399
413
  var route = new Route(url);
400
414
 
401
415
  actions = extend({}, DEFAULT_ACTIONS, actions);
@@ -405,7 +419,8 @@ angular.module('ngResource', ['ng']).
405
419
  actionParams = extend({}, paramDefaults, actionParams);
406
420
  forEach(actionParams, function(value, key){
407
421
  if (isFunction(value)) { value = value(); }
408
- ids[key] = value && value.charAt && value.charAt(0) == '@' ? getter(data, value.substr(1)) : value;
422
+ ids[key] = value && value.charAt && value.charAt(0) == '@' ?
423
+ getter(data, value.substr(1)) : value;
409
424
  });
410
425
  return ids;
411
426
  }
@@ -424,6 +439,7 @@ angular.module('ngResource', ['ng']).
424
439
  Resource[name] = function(a1, a2, a3, a4) {
425
440
  var params = {}, data, success, error;
426
441
 
442
+ /* jshint -W086 */ /* (purposefully fall through case statements) */
427
443
  switch(arguments.length) {
428
444
  case 4:
429
445
  error = a4;
@@ -455,14 +471,18 @@ angular.module('ngResource', ['ng']).
455
471
  case 0: break;
456
472
  default:
457
473
  throw $resourceMinErr('badargs',
458
- "Expected up to 4 arguments [params, data, success, error], got {0} arguments", arguments.length);
474
+ "Expected up to 4 arguments [params, data, success, error], got {0} arguments",
475
+ arguments.length);
459
476
  }
477
+ /* jshint +W086 */ /* (purposefully fall through case statements) */
460
478
 
461
479
  var isInstanceCall = data instanceof Resource;
462
480
  var value = isInstanceCall ? data : (action.isArray ? [] : new Resource(data));
463
481
  var httpConfig = {};
464
- var responseInterceptor = action.interceptor && action.interceptor.response || defaultResponseInterceptor;
465
- var responseErrorInterceptor = action.interceptor && action.interceptor.responseError || undefined;
482
+ var responseInterceptor = action.interceptor && action.interceptor.response ||
483
+ defaultResponseInterceptor;
484
+ var responseErrorInterceptor = action.interceptor && action.interceptor.responseError ||
485
+ undefined;
466
486
 
467
487
  forEach(action, function(value, key) {
468
488
  if (key != 'params' && key != 'isArray' && key != 'interceptor') {
@@ -470,19 +490,24 @@ angular.module('ngResource', ['ng']).
470
490
  }
471
491
  });
472
492
 
473
- httpConfig.data = data;
474
- route.setUrlParams(httpConfig, extend({}, extractParams(data, action.params || {}), params), action.url);
493
+ if (hasBody) httpConfig.data = data;
494
+ route.setUrlParams(httpConfig,
495
+ extend({}, extractParams(data, action.params || {}), params),
496
+ action.url);
475
497
 
476
498
  var promise = $http(httpConfig).then(function(response) {
477
499
  var data = response.data,
478
500
  promise = value.$promise;
479
501
 
480
502
  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}',
503
+ // Need to convert action.isArray to boolean in case it is undefined
504
+ // jshint -W018
505
+ if ( angular.isArray(data) !== (!!action.isArray) ) {
506
+ throw $resourceMinErr('badcfg', 'Error in resource configuration. Expected ' +
507
+ 'response to contain an {0} but got an {1}',
484
508
  action.isArray?'array':'object', angular.isArray(data)?'array':'object');
485
509
  }
510
+ // jshint +W018
486
511
  if (action.isArray) {
487
512
  value.length = 0;
488
513
  forEach(data, function(item) {
@@ -496,8 +521,6 @@ angular.module('ngResource', ['ng']).
496
521
 
497
522
  value.$resolved = true;
498
523
 
499
- (success||noop)(value, response.headers);
500
-
501
524
  response.resource = value;
502
525
 
503
526
  return response;
@@ -507,8 +530,15 @@ angular.module('ngResource', ['ng']).
507
530
  (error||noop)(response);
508
531
 
509
532
  return $q.reject(response);
510
- }).then(responseInterceptor, responseErrorInterceptor);
533
+ });
511
534
 
535
+ promise = promise.then(
536
+ function(response) {
537
+ var value = responseInterceptor(response);
538
+ (success||noop)(value, response.headers);
539
+ return value;
540
+ },
541
+ responseErrorInterceptor);
512
542
 
513
543
  if (!isInstanceCall) {
514
544
  // we are creating instance / collection
@@ -535,13 +565,13 @@ angular.module('ngResource', ['ng']).
535
565
  });
536
566
 
537
567
  Resource.bind = function(additionalParamDefaults){
538
- return ResourceFactory(url, extend({}, paramDefaults, additionalParamDefaults), actions);
568
+ return resourceFactory(url, extend({}, paramDefaults, additionalParamDefaults), actions);
539
569
  };
540
570
 
541
571
  return Resource;
542
572
  }
543
573
 
544
- return ResourceFactory;
574
+ return resourceFactory;
545
575
  }]);
546
576
 
547
577
 
@@ -1,14 +1,12 @@
1
1
  /*
2
- AngularJS v1.2.0rc1
2
+ AngularJS v1.2.0
3
3
  (c) 2010-2012 Google, Inc. http://angularjs.org
4
4
  License: MIT
5
5
  */
6
- (function(H,g,C){'use strict';var A=g.$$minErr("$resource");g.module("ngResource",["ng"]).factory("$resource",["$http","$parse","$q",function(D,y,E){function n(g,h){this.template=g;this.defaults=h||{};this.urlParams={}}function u(l,h,d){function p(c,b){var e={};b=v({},h,b);q(b,function(a,b){t(a)&&(a=a());var m;a&&a.charAt&&"@"==a.charAt(0)?(m=a.substr(1),m=y(m)(c)):m=a;e[b]=m});return e}function b(c){return c.resource}function e(c){z(c||{},this)}var F=new n(l);d=v({},G,d);q(d,function(c,f){var h=
7
- /^(POST|PUT|PATCH)$/i.test(c.method);e[f]=function(a,f,m,l){var d={},r,s,w;switch(arguments.length){case 4:w=l,s=m;case 3:case 2:if(t(f)){if(t(a)){s=a;w=f;break}s=f;w=m}else{d=a;r=f;s=m;break}case 1:t(a)?s=a:h?r=a:d=a;break;case 0:break;default:throw A("badargs",arguments.length);}var n=r instanceof e,k=n?r:c.isArray?[]:new e(r),x={},u=c.interceptor&&c.interceptor.response||b,y=c.interceptor&&c.interceptor.responseError||C;q(c,function(a,c){"params"!=c&&("isArray"!=c&&"interceptor"!=c)&&(x[c]=z(a))});
8
- x.data=r;F.setUrlParams(x,v({},p(r,c.params||{}),d),c.url);d=D(x).then(function(a){var b=a.data,f=k.$promise;if(b){if(g.isArray(b)!=!!c.isArray)throw A("badcfg",c.isArray?"array":"object",g.isArray(b)?"array":"object");c.isArray?(k.length=0,q(b,function(a){k.push(new e(a))})):(z(b,k),k.$promise=f)}k.$resolved=!0;(s||B)(k,a.headers);a.resource=k;return a},function(a){k.$resolved=!0;(w||B)(a);return E.reject(a)}).then(u,y);return n?d:(k.$promise=d,k.$resolved=!1,k)};e.prototype["$"+f]=function(a,c,
9
- b){t(a)&&(b=c,c=a,a={});a=e[f](a,this,c,b);return a.$promise||a}});e.bind=function(c){return u(l,v({},h,c),d)};return e}var G={get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}},B=g.noop,q=g.forEach,v=g.extend,z=g.copy,t=g.isFunction;n.prototype={setUrlParams:function(l,h,d){var p=this,b=d||p.template,e,n,c=p.urlParams={};q(b.split(/\W/),function(f){!/^\d+$/.test(f)&&(f&&RegExp("(^|[^\\\\]):"+f+"(\\W|$)").test(b))&&(c[f]=!0)});
10
- b=b.replace(/\\:/g,":");h=h||{};q(p.urlParams,function(c,d){e=h.hasOwnProperty(d)?h[d]:p.defaults[d];g.isDefined(e)&&null!==e?(n=encodeURIComponent(e).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"%20").replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+"),b=b.replace(RegExp(":"+d+"(\\W|$)","g"),n+"$1")):b=b.replace(RegExp("(/?):"+d+"(\\W|$)","g"),function(a,c,b){return"/"==b.charAt(0)?b:c+b})});b=b.replace(/\/+$/,"");b=b.replace(/\/\.(?=\w+($|\?))/,
11
- ".");l.url=b.replace(/\/\\\./,"/.");q(h,function(c,b){p.urlParams[b]||(l.params=l.params||{},l.params[b]=c)})}};return u}])})(window,window.angular);
12
- /*
13
- //@ sourceMappingURL=angular-resource.min.js.map
14
- */
6
+ (function(H,h,C){'use strict';var x=h.$$minErr("$resource");h.module("ngResource",["ng"]).factory("$resource",["$http","$parse","$q",function(D,y,E){function n(h,k){this.template=h;this.defaults=k||{};this.urlParams={}}function t(e,k,f){function q(b,c){var d={};c=u({},k,c);r(c,function(a,c){s(a)&&(a=a());var m;a&&a.charAt&&"@"==a.charAt(0)?(m=a.substr(1),m=y(m)(b)):m=a;d[c]=m});return d}function d(b){return b.resource}function g(b){z(b||{},this)}var F=new n(e);f=u({},G,f);r(f,function(b,c){var A=
7
+ /^(POST|PUT|PATCH)$/i.test(b.method);g[c]=function(a,c,m,k){var p={},e,f,v;switch(arguments.length){case 4:v=k,f=m;case 3:case 2:if(s(c)){if(s(a)){f=a;v=c;break}f=c;v=m}else{p=a;e=c;f=m;break}case 1:s(a)?f=a:A?e=a:p=a;break;case 0:break;default:throw x("badargs",arguments.length);}var n=e instanceof g,l=n?e:b.isArray?[]:new g(e),w={},t=b.interceptor&&b.interceptor.response||d,y=b.interceptor&&b.interceptor.responseError||C;r(b,function(a,c){"params"!=c&&("isArray"!=c&&"interceptor"!=c)&&(w[c]=z(a))});
8
+ A&&(w.data=e);F.setUrlParams(w,u({},q(e,b.params||{}),p),b.url);p=D(w).then(function(c){var a=c.data,d=l.$promise;if(a){if(h.isArray(a)!==!!b.isArray)throw x("badcfg",b.isArray?"array":"object",h.isArray(a)?"array":"object");b.isArray?(l.length=0,r(a,function(a){l.push(new g(a))})):(z(a,l),l.$promise=d)}l.$resolved=!0;c.resource=l;return c},function(a){l.$resolved=!0;(v||B)(a);return E.reject(a)});p=p.then(function(a){var c=t(a);(f||B)(c,a.headers);return c},y);return n?p:(l.$promise=p,l.$resolved=
9
+ !1,l)};g.prototype["$"+c]=function(a,b,d){s(a)&&(d=b,b=a,a={});a=g[c](a,this,b,d);return a.$promise||a}});g.bind=function(b){return t(e,u({},k,b),f)};return g}var G={get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}},B=h.noop,r=h.forEach,u=h.extend,z=h.copy,s=h.isFunction;n.prototype={setUrlParams:function(e,k,f){var q=this,d=f||q.template,g,n,b=q.urlParams={};r(d.split(/\W/),function(c){if("hasOwnProperty"===c)throw x("badname");
10
+ !/^\d+$/.test(c)&&(c&&RegExp("(^|[^\\\\]):"+c+"(\\W|$)").test(d))&&(b[c]=!0)});d=d.replace(/\\:/g,":");k=k||{};r(q.urlParams,function(c,b){g=k.hasOwnProperty(b)?k[b]:q.defaults[b];h.isDefined(g)&&null!==g?(n=encodeURIComponent(g).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"%20").replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+"),d=d.replace(RegExp(":"+b+"(\\W|$)","g"),n+"$1")):d=d.replace(RegExp("(/?):"+b+"(\\W|$)","g"),function(a,
11
+ c,b){return"/"==b.charAt(0)?b:c+b})});d=d.replace(/\/+$/,"");d=d.replace(/\/\.(?=\w+($|\?))/,".");e.url=d.replace(/\/\\\./,"/.");r(k,function(c,b){q.urlParams[b]||(e.params=e.params||{},e.params[b]=c)})}};return t}])})(window,window.angular);
12
+ //# sourceMappingURL=angular-resource.min.js.map
@@ -0,0 +1,8 @@
1
+ {
2
+ "version":3,
3
+ "file":"angular-resource.min.js",
4
+ "lineCount":11,
5
+ "mappings":"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",
6
+ "sources":["angular-resource.js"],
7
+ "names":["window","angular","undefined","$resourceMinErr","$$minErr","module","factory","$http","$parse","$q","Route","template","defaults","urlParams","resourceFactory","url","paramDefaults","actions","extractParams","data","actionParams","ids","extend","forEach","value","key","isFunction","charAt","path","obj","defaultResponseInterceptor","response","resource","Resource","copy","route","DEFAULT_ACTIONS","action","name","hasBody","test","method","a1","a2","a3","a4","params","success","error","arguments","length","isInstanceCall","isArray","httpConfig","responseInterceptor","interceptor","responseErrorInterceptor","responseError","setUrlParams","promise","then","$promise","item","push","$resolved","noop","reject","headers","prototype","result","bind","Resource.bind","additionalParamDefaults","config","actionUrl","self","val","encodedVal","split","param","RegExp","replace","_","urlParam","hasOwnProperty","isDefined","encodeURIComponent","match","leadingSlashes","tail"]
8
+ }
@@ -1,34 +1,24 @@
1
1
  /**
2
- * @license AngularJS v1.2.0rc1
2
+ * @license AngularJS v1.2.0
3
3
  * (c) 2010-2012 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
6
6
  (function(window, angular, undefined) {'use strict';
7
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
8
  /**
25
9
  * @ngdoc overview
26
10
  * @name ngRoute
27
11
  * @description
28
12
  *
29
- * Module that provides routing and deeplinking services and directives for angular apps.
13
+ * # ngRoute
14
+ *
15
+ * The `ngRoute` module provides routing and deeplinking services and directives for angular apps.
16
+ *
17
+ * {@installModule route}
18
+ *
19
+ * <div doc-module-components="ngRoute"></div>
30
20
  */
31
-
21
+ /* global -ngRouteModule */
32
22
  var ngRouteModule = angular.module('ngRoute', ['ng']).
33
23
  provider('$route', $RouteProvider);
34
24
 
@@ -40,8 +30,14 @@ var ngRouteModule = angular.module('ngRoute', ['ng']).
40
30
  * @description
41
31
  *
42
32
  * Used for configuring routes. See {@link ngRoute.$route $route} for an example.
33
+ *
34
+ * Requires the {@link ngRoute `ngRoute`} module to be installed.
43
35
  */
44
36
  function $RouteProvider(){
37
+ function inherit(parent, extra) {
38
+ return angular.extend(new (angular.extend(function() {}, {prototype:parent}))(), extra);
39
+ }
40
+
45
41
  var routes = {};
46
42
 
47
43
  /**
@@ -57,8 +53,8 @@ function $RouteProvider(){
57
53
  * * `path` can contain named groups starting with a colon (`:name`). All characters up
58
54
  * to the next slash are matched and stored in `$routeParams` under the given `name`
59
55
  * 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`
56
+ * * `path` can contain named groups starting with a colon and ending with a star (`:name*`).
57
+ * All characters are eagerly stored in `$routeParams` under the given `name`
62
58
  * when the route matches.
63
59
  * * `path` can contain optional named groups with a question mark (`:name?`).
64
60
  *
@@ -74,9 +70,9 @@ function $RouteProvider(){
74
70
  *
75
71
  * Object properties:
76
72
  *
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.
73
+ * - `controller` – `{(string|function()=}` – Controller fn that should be associated with
74
+ * newly created scope or the name of a {@link angular.Module#controller registered
75
+ * controller} if passed as a string.
80
76
  * - `controllerAs` – `{string=}` – A controller alias name. If present the controller will be
81
77
  * published to scope under the `controllerAs` name.
82
78
  * - `template` – `{string=|function()=}` – html template as a string or a function that
@@ -98,17 +94,22 @@ function $RouteProvider(){
98
94
  * `$location.path()` by applying the current route
99
95
  *
100
96
  * - `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:
97
+ * be injected into the controller. If any of these dependencies are promises, the router
98
+ * will wait for them all to be resolved or one to be rejected before the controller is
99
+ * instantiated.
100
+ * If all the promises are resolved successfully, the values of the resolved promises are
101
+ * injected and {@link ngRoute.$route#$routeChangeSuccess $routeChangeSuccess} event is
102
+ * fired. If any of the promises are rejected the
103
+ * {@link ngRoute.$route#$routeChangeError $routeChangeError} event is fired. The map object
104
+ * is:
104
105
  *
105
106
  * - `key` – `{string}`: a name of a dependency to be injected into the controller.
106
107
  * - `factory` - `{string|function}`: If `string` then it is an alias for a service.
107
108
  * 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.
109
+ * and the return value is treated as the dependency. If the result is a promise, it is
110
+ * resolved before its value is injected into the controller. Be aware that
111
+ * `ngRoute.$routeParams` will still refer to the previous route within these resolve
112
+ * functions. Use `$route.current.params` to access the new route parameters, instead.
112
113
  *
113
114
  * - `redirectTo` – {(string|function())=} – value to update
114
115
  * {@link ng.$location $location} path with and trigger route redirection.
@@ -123,8 +124,8 @@ function $RouteProvider(){
123
124
  * The custom `redirectTo` function is expected to return a string which will be used
124
125
  * to update `$location.path()` and `$location.search()`.
125
126
  *
126
- * - `[reloadOnSearch=true]` - {boolean=} - reload route when only $location.search()
127
- * changes.
127
+ * - `[reloadOnSearch=true]` - {boolean=} - reload route when only `$location.search()`
128
+ * or `$location.hash()` changes.
128
129
  *
129
130
  * If the option is set to `false` and url in the browser changes, then
130
131
  * `$routeUpdate` event is broadcasted on the root scope.
@@ -140,7 +141,7 @@ function $RouteProvider(){
140
141
  * Adds a new route definition to the `$route` service.
141
142
  */
142
143
  this.when = function(path, route) {
143
- routes[path] = extend(
144
+ routes[path] = angular.extend(
144
145
  {reloadOnSearch: true},
145
146
  route,
146
147
  path && pathRegExp(path, route)
@@ -149,10 +150,10 @@ function $RouteProvider(){
149
150
  // create redirection for trailing slashes
150
151
  if (path) {
151
152
  var redirectPath = (path[path.length-1] == '/')
152
- ? path.substr(0, path.length-1)
153
- : path +'/';
153
+ ? path.substr(0, path.length-1)
154
+ : path +'/';
154
155
 
155
- routes[redirectPath] = extend(
156
+ routes[redirectPath] = angular.extend(
156
157
  {redirectTo: path},
157
158
  pathRegExp(redirectPath, route)
158
159
  );
@@ -191,7 +192,9 @@ function $RouteProvider(){
191
192
  + (optional ? '' : slash)
192
193
  + '(?:'
193
194
  + (optional ? slash : '')
194
- + (star && '(.+)?' || '([^/]+)?') + ')'
195
+ + (star && '(.+?)' || '([^/]+)')
196
+ + (optional || '')
197
+ + ')'
195
198
  + (optional || '');
196
199
  })
197
200
  .replace(/([\/$\*])/g, '\\$1');
@@ -218,8 +221,15 @@ function $RouteProvider(){
218
221
  };
219
222
 
220
223
 
221
- this.$get = ['$rootScope', '$location', '$routeParams', '$q', '$injector', '$http', '$templateCache', '$sce',
222
- function( $rootScope, $location, $routeParams, $q, $injector, $http, $templateCache, $sce) {
224
+ this.$get = ['$rootScope',
225
+ '$location',
226
+ '$routeParams',
227
+ '$q',
228
+ '$injector',
229
+ '$http',
230
+ '$templateCache',
231
+ '$sce',
232
+ function($rootScope, $location, $routeParams, $q, $injector, $http, $templateCache, $sce) {
223
233
 
224
234
  /**
225
235
  * @ngdoc object
@@ -241,13 +251,16 @@ function $RouteProvider(){
241
251
  * @property {Array.<Object>} routes Array of all configured routes.
242
252
  *
243
253
  * @description
244
- * Is used for deep-linking URLs to controllers and views (HTML partials).
254
+ * `$route` is used for deep-linking URLs to controllers and views (HTML partials).
245
255
  * It watches `$location.url()` and tries to map the path to an existing route definition.
246
256
  *
257
+ * Requires the {@link ngRoute `ngRoute`} module to be installed.
258
+ *
247
259
  * You can define routes through {@link ngRoute.$routeProvider $routeProvider}'s API.
248
260
  *
249
- * The `$route` service is typically used in conjunction with {@link ngRoute.directive:ngView ngView}
250
- * directive and the {@link ngRoute.$routeParams $routeParams} service.
261
+ * The `$route` service is typically used in conjunction with the
262
+ * {@link ngRoute.directive:ngView `ngView`} directive and the
263
+ * {@link ngRoute.$routeParams `$routeParams`} service.
251
264
  *
252
265
  * @example
253
266
  This example shows how changing the URL hash causes the `$route` to match a route against the
@@ -256,7 +269,7 @@ function $RouteProvider(){
256
269
  Note that this example is using {@link ng.directive:script inlined templates}
257
270
  to get it working on jsfiddle as well.
258
271
 
259
- <example module="ngView" deps="angular-route.js">
272
+ <example module="ngViewExample" deps="angular-route.js">
260
273
  <file name="index.html">
261
274
  <div ng-controller="MainCntl">
262
275
  Choose:
@@ -289,7 +302,9 @@ function $RouteProvider(){
289
302
  </file>
290
303
 
291
304
  <file name="script.js">
292
- angular.module('ngView', ['ngRoute']).config(function($routeProvider, $locationProvider) {
305
+ angular.module('ngViewExample', ['ngRoute'])
306
+
307
+ .config(function($routeProvider, $locationProvider) {
293
308
  $routeProvider.when('/Book/:bookId', {
294
309
  templateUrl: 'book.html',
295
310
  controller: BookCntl,
@@ -358,6 +373,7 @@ function $RouteProvider(){
358
373
  * defined in `resolve` route property. Once all of the dependencies are resolved
359
374
  * `$routeChangeSuccess` is fired.
360
375
  *
376
+ * @param {Object} angularEvent Synthetic event object.
361
377
  * @param {Route} next Future route information.
362
378
  * @param {Route} current Current route information.
363
379
  */
@@ -374,7 +390,8 @@ function $RouteProvider(){
374
390
  *
375
391
  * @param {Object} angularEvent Synthetic event object.
376
392
  * @param {Route} current Current route information.
377
- * @param {Route|Undefined} previous Previous route information, or undefined if current is first route entered.
393
+ * @param {Route|Undefined} previous Previous route information, or undefined if current is
394
+ * first route entered.
378
395
  */
379
396
 
380
397
  /**
@@ -385,6 +402,7 @@ function $RouteProvider(){
385
402
  * @description
386
403
  * Broadcasted if any of the resolve promises are rejected.
387
404
  *
405
+ * @param {Object} angularEvent Synthetic event object
388
406
  * @param {Route} current Current route information.
389
407
  * @param {Route} previous Previous route information.
390
408
  * @param {Route} rejection Rejection of the promise. Usually the error of the failed promise.
@@ -449,13 +467,12 @@ function $RouteProvider(){
449
467
  var m = route.regexp.exec(on);
450
468
  if (!m) return null;
451
469
 
452
- var N = 0;
453
470
  for (var i = 1, len = m.length; i < len; ++i) {
454
471
  var key = keys[i - 1];
455
472
 
456
473
  var val = 'string' == typeof m[i]
457
- ? decodeURIComponent(m[i])
458
- : m[i];
474
+ ? decodeURIComponent(m[i])
475
+ : m[i];
459
476
 
460
477
  if (key && val) {
461
478
  params[key.name] = val;
@@ -469,9 +486,10 @@ function $RouteProvider(){
469
486
  last = $route.current;
470
487
 
471
488
  if (next && last && next.$$route === last.$$route
472
- && equals(next.pathParams, last.pathParams) && !next.reloadOnSearch && !forceReload) {
489
+ && angular.equals(next.pathParams, last.pathParams)
490
+ && !next.reloadOnSearch && !forceReload) {
473
491
  last.params = next.params;
474
- copy(last.params, $routeParams);
492
+ angular.copy(last.params, $routeParams);
475
493
  $rootScope.$broadcast('$routeUpdate', last);
476
494
  } else if (next || last) {
477
495
  forceReload = false;
@@ -479,7 +497,7 @@ function $RouteProvider(){
479
497
  $route.current = next;
480
498
  if (next) {
481
499
  if (next.redirectTo) {
482
- if (isString(next.redirectTo)) {
500
+ if (angular.isString(next.redirectTo)) {
483
501
  $location.path(interpolate(next.redirectTo, next.params)).search(next.params)
484
502
  .replace();
485
503
  } else {
@@ -492,29 +510,30 @@ function $RouteProvider(){
492
510
  $q.when(next).
493
511
  then(function() {
494
512
  if (next) {
495
- var locals = extend({}, next.resolve),
513
+ var locals = angular.extend({}, next.resolve),
496
514
  template, templateUrl;
497
515
 
498
- forEach(locals, function(value, key) {
499
- locals[key] = isString(value) ? $injector.get(value) : $injector.invoke(value);
516
+ angular.forEach(locals, function(value, key) {
517
+ locals[key] = angular.isString(value) ?
518
+ $injector.get(value) : $injector.invoke(value);
500
519
  });
501
520
 
502
- if (isDefined(template = next.template)) {
503
- if (isFunction(template)) {
521
+ if (angular.isDefined(template = next.template)) {
522
+ if (angular.isFunction(template)) {
504
523
  template = template(next.params);
505
524
  }
506
- } else if (isDefined(templateUrl = next.templateUrl)) {
507
- if (isFunction(templateUrl)) {
525
+ } else if (angular.isDefined(templateUrl = next.templateUrl)) {
526
+ if (angular.isFunction(templateUrl)) {
508
527
  templateUrl = templateUrl(next.params);
509
528
  }
510
529
  templateUrl = $sce.getTrustedResourceUrl(templateUrl);
511
- if (isDefined(templateUrl)) {
530
+ if (angular.isDefined(templateUrl)) {
512
531
  next.loadedTemplateUrl = templateUrl;
513
532
  template = $http.get(templateUrl, {cache: $templateCache}).
514
533
  then(function(response) { return response.data; });
515
534
  }
516
535
  }
517
- if (isDefined(template)) {
536
+ if (angular.isDefined(template)) {
518
537
  locals['$template'] = template;
519
538
  }
520
539
  return $q.all(locals);
@@ -525,7 +544,7 @@ function $RouteProvider(){
525
544
  if (next == $route.current) {
526
545
  if (next) {
527
546
  next.locals = locals;
528
- copy(next.params, $routeParams);
547
+ angular.copy(next.params, $routeParams);
529
548
  }
530
549
  $rootScope.$broadcast('$routeChangeSuccess', next, last);
531
550
  }
@@ -544,10 +563,10 @@ function $RouteProvider(){
544
563
  function parseRoute() {
545
564
  // Match a route
546
565
  var params, match;
547
- forEach(routes, function(route, path) {
566
+ angular.forEach(routes, function(route, path) {
548
567
  if (!match && (params = switchRouteMatcher($location.path(), route))) {
549
568
  match = inherit(route, {
550
- params: extend({}, $location.search(), params),
569
+ params: angular.extend({}, $location.search(), params),
551
570
  pathParams: params});
552
571
  match.$$route = route;
553
572
  }
@@ -561,8 +580,8 @@ function $RouteProvider(){
561
580
  */
562
581
  function interpolate(string, params) {
563
582
  var result = [];
564
- forEach((string||'').split(':'), function(segment, i) {
565
- if (i == 0) {
583
+ angular.forEach((string||'').split(':'), function(segment, i) {
584
+ if (i === 0) {
566
585
  result.push(segment);
567
586
  } else {
568
587
  var segmentMatch = segment.match(/(\w+)(.*)/);
@@ -586,9 +605,13 @@ ngRouteModule.provider('$routeParams', $RouteParamsProvider);
586
605
  * @requires $route
587
606
  *
588
607
  * @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.
608
+ * The `$routeParams` service allows you to retrieve the current set of route parameters.
609
+ *
610
+ * Requires the {@link ngRoute `ngRoute`} module to be installed.
611
+ *
612
+ * The route parameters are a combination of {@link ng.$location `$location`}'s
613
+ * {@link ng.$location#methods_search `search()`} and {@link ng.$location#methods_path `path()`}.
614
+ * The `path` parameters are extracted when the {@link ngRoute.$route `$route`} path is matched.
592
615
  *
593
616
  * In case of parameter name collision, `path` params take precedence over `search` params.
594
617
  *
@@ -613,6 +636,8 @@ function $RouteParamsProvider() {
613
636
  this.$get = function() { return {}; };
614
637
  }
615
638
 
639
+ ngRouteModule.directive('ngView', ngViewFactory);
640
+
616
641
  /**
617
642
  * @ngdoc directive
618
643
  * @name ngRoute.directive:ngView
@@ -625,6 +650,8 @@ function $RouteParamsProvider() {
625
650
  * Every time the current route changes, the included view changes with it according to the
626
651
  * configuration of the `$route` service.
627
652
  *
653
+ * Requires the {@link ngRoute `ngRoute`} module to be installed.
654
+ *
628
655
  * @animations
629
656
  * enter - animation is used to bring new content into the browser.
630
657
  * leave - animation is used to animate existing content away.
@@ -632,6 +659,7 @@ function $RouteParamsProvider() {
632
659
  * The enter and leave animation occur concurrently.
633
660
  *
634
661
  * @scope
662
+ * @priority 400
635
663
  * @example
636
664
  <example module="ngViewExample" deps="angular-route.js" animations="true">
637
665
  <file name="index.html">
@@ -643,8 +671,8 @@ function $RouteParamsProvider() {
643
671
  <a href="Book/Gatsby/ch/4?key=value">Gatsby: Ch4</a> |
644
672
  <a href="Book/Scarlet">Scarlet Letter</a><br/>
645
673
 
646
- <div class="example-animate-container">
647
- <div ng-view class="view-example"></div>
674
+ <div class="view-animate-container">
675
+ <div ng-view class="view-animate"></div>
648
676
  </div>
649
677
  <hr />
650
678
 
@@ -672,7 +700,9 @@ function $RouteParamsProvider() {
672
700
  </file>
673
701
 
674
702
  <file name="animations.css">
675
- .example-animate-container {
703
+ .view-animate-container {
704
+ position:relative;
705
+ height:100px!important;
676
706
  position:relative;
677
707
  background:white;
678
708
  border:1px solid black;
@@ -680,14 +710,12 @@ function $RouteParamsProvider() {
680
710
  overflow:hidden;
681
711
  }
682
712
 
683
- .example-animate-container > div {
713
+ .view-animate {
684
714
  padding:10px;
685
715
  }
686
716
 
687
- .view-example.ng-enter, .view-example.ng-leave {
717
+ .view-animate.ng-enter, .view-animate.ng-leave {
688
718
  -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
719
  transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;
692
720
 
693
721
  display:block;
@@ -702,39 +730,33 @@ function $RouteParamsProvider() {
702
730
  padding:10px;
703
731
  }
704
732
 
705
- .example-animate-container {
706
- position:relative;
707
- height:100px;
708
- }
709
-
710
- .view-example.ng-enter {
733
+ .view-animate.ng-enter {
711
734
  left:100%;
712
735
  }
713
- .view-example.ng-enter.ng-enter-active {
736
+ .view-animate.ng-enter.ng-enter-active {
714
737
  left:0;
715
738
  }
716
-
717
- .view-example.ng-leave { }
718
- .view-example.ng-leave.ng-leave-active {
739
+ .view-animate.ng-leave.ng-leave-active {
719
740
  left:-100%;
720
741
  }
721
742
  </file>
722
743
 
723
744
  <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);
745
+ angular.module('ngViewExample', ['ngRoute', 'ngAnimate'],
746
+ function($routeProvider, $locationProvider) {
747
+ $routeProvider.when('/Book/:bookId', {
748
+ templateUrl: 'book.html',
749
+ controller: BookCntl,
750
+ controllerAs: 'book'
751
+ });
752
+ $routeProvider.when('/Book/:bookId/ch/:chapterId', {
753
+ templateUrl: 'chapter.html',
754
+ controller: ChapterCntl,
755
+ controllerAs: 'chapter'
756
+ });
757
+
758
+ // configure html5 to get links working on jsfiddle
759
+ $locationProvider.html5Mode(true);
738
760
  });
739
761
 
740
762
  function MainCntl($route, $routeParams, $location) {
@@ -780,22 +802,19 @@ function $RouteParamsProvider() {
780
802
  * @description
781
803
  * Emitted every time the ngView content is reloaded.
782
804
  */
783
- var NG_VIEW_PRIORITY = 500;
784
- var ngViewDirective = ['$route', '$anchorScroll', '$compile', '$controller', '$animate',
785
- function($route, $anchorScroll, $compile, $controller, $animate) {
805
+ ngViewFactory.$inject = ['$route', '$anchorScroll', '$compile', '$controller', '$animate'];
806
+ function ngViewFactory( $route, $anchorScroll, $compile, $controller, $animate) {
786
807
  return {
787
808
  restrict: 'ECA',
788
809
  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;
810
+ priority: 400,
811
+ transclude: 'element',
812
+ compile: function(element, attr, linker) {
813
+ return function(scope, $element, attr) {
814
+ var currentScope,
815
+ currentElement,
816
+ autoScrollExp = attr.autoscroll,
817
+ onloadExp = attr.onload || '';
799
818
 
800
819
  scope.$on('$routeChangeSuccess', update);
801
820
  update();
@@ -816,45 +835,46 @@ var ngViewDirective = ['$route', '$anchorScroll', '$compile', '$controller', '$a
816
835
  template = locals && locals.$template;
817
836
 
818
837
  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;
838
+ var newScope = scope.$new();
839
+ linker(newScope, function(clone) {
840
+ clone.html(template);
841
+ $animate.enter(clone, null, currentElement || $element, function onNgViewEnter () {
842
+ if (angular.isDefined(autoScrollExp)
843
+ && (!autoScrollExp || scope.$eval(autoScrollExp))) {
844
+ $anchorScroll();
845
+ }
846
+ });
828
847
 
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
- }
848
+ cleanupLastView();
838
849
 
839
- current.scope = currentScope;
850
+ var link = $compile(clone.contents()),
851
+ current = $route.current;
840
852
 
841
- link(currentScope);
853
+ currentScope = current.scope = newScope;
854
+ currentElement = clone;
842
855
 
843
- currentScope.$emit('$viewContentLoaded');
844
- currentScope.$eval(onloadExp);
856
+ if (current.controller) {
857
+ locals.$scope = currentScope;
858
+ var controller = $controller(current.controller, locals);
859
+ if (current.controllerAs) {
860
+ currentScope[current.controllerAs] = controller;
861
+ }
862
+ clone.data('$ngControllerController', controller);
863
+ clone.children().data('$ngControllerController', controller);
864
+ }
845
865
 
846
- // $anchorScroll might listen on event...
847
- $anchorScroll();
866
+ link(currentScope);
867
+ currentScope.$emit('$viewContentLoaded');
868
+ currentScope.$eval(onloadExp);
869
+ });
848
870
  } else {
849
871
  cleanupLastView();
850
872
  }
851
873
  }
852
- }
874
+ };
853
875
  }
854
876
  };
855
- }];
856
-
857
- ngRouteModule.directive('ngView', ngViewDirective);
877
+ }
858
878
 
859
879
 
860
880
  })(window, window.angular);