angular-rails-engine 1.2.0.0 → 1.2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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);