angularjs-rails 1.2.14 → 1.2.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/angularjs-rails/version.rb +2 -2
- data/vendor/assets/javascripts/angular-animate.js +4 -5
- data/vendor/assets/javascripts/angular-cookies.js +8 -9
- data/vendor/assets/javascripts/angular-loader.js +6 -8
- data/vendor/assets/javascripts/angular-mocks.js +10 -11
- data/vendor/assets/javascripts/angular-resource.js +13 -3
- data/vendor/assets/javascripts/angular-route.js +139 -134
- data/vendor/assets/javascripts/angular-sanitize.js +2 -2
- data/vendor/assets/javascripts/angular-scenario.js +190 -81
- data/vendor/assets/javascripts/angular-touch.js +16 -2
- data/vendor/assets/javascripts/angular.js +196 -81
- data/vendor/assets/javascripts/unstable/angular-animate.js +1613 -0
- data/vendor/assets/javascripts/unstable/angular-cookies.js +40 -29
- data/vendor/assets/javascripts/unstable/angular-loader.js +166 -58
- data/vendor/assets/javascripts/unstable/angular-mocks.js +832 -535
- data/vendor/assets/javascripts/unstable/angular-resource.js +266 -196
- data/vendor/assets/javascripts/unstable/angular-route.js +927 -0
- data/vendor/assets/javascripts/unstable/angular-sanitize.js +246 -180
- data/vendor/assets/javascripts/unstable/angular-scenario.js +19167 -13895
- data/vendor/assets/javascripts/unstable/{angular-mobile.js → angular-touch.js} +241 -126
- data/vendor/assets/javascripts/unstable/angular.js +12891 -8032
- metadata +5 -3
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
2
|
+
* @license AngularJS v1.2.15
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -215,6 +215,7 @@ ngTouch.directive('ngClick', ['$parse', '$timeout', '$rootElement',
|
|
215
215
|
var ACTIVE_CLASS_NAME = 'ng-click-active';
|
216
216
|
var lastPreventedTime;
|
217
217
|
var touchCoordinates;
|
218
|
+
var lastLabelClickCoordinates;
|
218
219
|
|
219
220
|
|
220
221
|
// TAP EVENTS AND GHOST CLICKS
|
@@ -286,10 +287,23 @@ ngTouch.directive('ngClick', ['$parse', '$timeout', '$rootElement',
|
|
286
287
|
var y = touches[0].clientY;
|
287
288
|
// Work around desktop Webkit quirk where clicking a label will fire two clicks (on the label
|
288
289
|
// and on the input element). Depending on the exact browser, this second click we don't want
|
289
|
-
// to bust has either (0,0) or
|
290
|
+
// to bust has either (0,0), negative coordinates, or coordinates equal to triggering label
|
291
|
+
// click event
|
290
292
|
if (x < 1 && y < 1) {
|
291
293
|
return; // offscreen
|
292
294
|
}
|
295
|
+
if (lastLabelClickCoordinates &&
|
296
|
+
lastLabelClickCoordinates[0] === x && lastLabelClickCoordinates[1] === y) {
|
297
|
+
return; // input click triggered by label click
|
298
|
+
}
|
299
|
+
// reset label click coordinates on first subsequent click
|
300
|
+
if (lastLabelClickCoordinates) {
|
301
|
+
lastLabelClickCoordinates = null;
|
302
|
+
}
|
303
|
+
// remember label click coordinates to prevent click busting of trigger click event on input
|
304
|
+
if (event.target.tagName.toLowerCase() === 'label') {
|
305
|
+
lastLabelClickCoordinates = [x, y];
|
306
|
+
}
|
293
307
|
|
294
308
|
// Look for an allowable region containing this click.
|
295
309
|
// If we find one, that means it was created by touchstart and not removed by
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
2
|
+
* @license AngularJS v1.2.15
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -68,7 +68,7 @@ function minErr(module) {
|
|
68
68
|
return match;
|
69
69
|
});
|
70
70
|
|
71
|
-
message = message + '\nhttp://errors.angularjs.org/1.2.
|
71
|
+
message = message + '\nhttp://errors.angularjs.org/1.2.15/' +
|
72
72
|
(module ? module + '/' : '') + code;
|
73
73
|
for (i = 2; i < arguments.length; i++) {
|
74
74
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
|
@@ -124,6 +124,7 @@ function minErr(module) {
|
|
124
124
|
-isWindow,
|
125
125
|
-isScope,
|
126
126
|
-isFile,
|
127
|
+
-isBlob,
|
127
128
|
-isBoolean,
|
128
129
|
-trim,
|
129
130
|
-isElement,
|
@@ -645,6 +646,11 @@ function isFile(obj) {
|
|
645
646
|
}
|
646
647
|
|
647
648
|
|
649
|
+
function isBlob(obj) {
|
650
|
+
return toString.call(obj) === '[object Blob]';
|
651
|
+
}
|
652
|
+
|
653
|
+
|
648
654
|
function isBoolean(value) {
|
649
655
|
return typeof value === 'boolean';
|
650
656
|
}
|
@@ -1314,6 +1320,41 @@ function angularInit(element, bootstrap) {
|
|
1314
1320
|
* Note that ngScenario-based end-to-end tests cannot use this function to bootstrap manually.
|
1315
1321
|
* They must use {@link ng.directive:ngApp ngApp}.
|
1316
1322
|
*
|
1323
|
+
* Angular will detect if it has been loaded into the browser more than once and only allow the
|
1324
|
+
* first loaded script to be bootstrapped and will report a warning to the browser console for
|
1325
|
+
* each of the subsequent scripts. This prevents strange results in applications, where otherwise
|
1326
|
+
* multiple instances of Angular try to work on the DOM.
|
1327
|
+
*
|
1328
|
+
* <example name="multi-bootstrap" module="multi-bootstrap">
|
1329
|
+
* <file name="index.html">
|
1330
|
+
* <script src="../../../angular.js"></script>
|
1331
|
+
* <div ng-controller="BrokenTable">
|
1332
|
+
* <table>
|
1333
|
+
* <tr>
|
1334
|
+
* <th ng-repeat="heading in headings">{{heading}}</th>
|
1335
|
+
* </tr>
|
1336
|
+
* <tr ng-repeat="filling in fillings">
|
1337
|
+
* <td ng-repeat="fill in filling">{{fill}}</td>
|
1338
|
+
* </tr>
|
1339
|
+
* </table>
|
1340
|
+
* </div>
|
1341
|
+
* </file>
|
1342
|
+
* <file name="controller.js">
|
1343
|
+
* var app = angular.module('multi-bootstrap', [])
|
1344
|
+
*
|
1345
|
+
* .controller('BrokenTable', function($scope) {
|
1346
|
+
* $scope.headings = ['One', 'Two', 'Three'];
|
1347
|
+
* $scope.fillings = [[1, 2, 3], ['A', 'B', 'C'], [7, 8, 9]];
|
1348
|
+
* });
|
1349
|
+
* </file>
|
1350
|
+
* <file name="protractor.js" type="protractor">
|
1351
|
+
* it('should only insert one table cell for each item in $scope.fillings', function() {
|
1352
|
+
* expect(element.all(by.css('td')).count())
|
1353
|
+
* .toBe(9);
|
1354
|
+
* });
|
1355
|
+
* </file>
|
1356
|
+
* </example>
|
1357
|
+
*
|
1317
1358
|
* @param {Element} element DOM element which is the root of angular application.
|
1318
1359
|
* @param {Array<String|Function|Array>=} modules an array of modules to load into the application.
|
1319
1360
|
* Each item in the array should be the name of a predefined module or a (DI annotated)
|
@@ -1531,16 +1572,16 @@ function setupModuleLoader(window) {
|
|
1531
1572
|
* myModule.value('appName', 'MyCoolApp');
|
1532
1573
|
*
|
1533
1574
|
* // configure existing services inside initialization blocks.
|
1534
|
-
* myModule.config(function($locationProvider) {
|
1575
|
+
* myModule.config(['$locationProvider', function($locationProvider) {
|
1535
1576
|
* // Configure existing providers
|
1536
1577
|
* $locationProvider.hashPrefix('!');
|
1537
|
-
* });
|
1578
|
+
* }]);
|
1538
1579
|
* ```
|
1539
1580
|
*
|
1540
1581
|
* Then you can create an injector and load your modules like this:
|
1541
1582
|
*
|
1542
1583
|
* ```js
|
1543
|
-
* var injector = angular.injector(['ng', '
|
1584
|
+
* var injector = angular.injector(['ng', 'myModule'])
|
1544
1585
|
* ```
|
1545
1586
|
*
|
1546
1587
|
* However it's more likely that you'll just use
|
@@ -1549,7 +1590,7 @@ function setupModuleLoader(window) {
|
|
1549
1590
|
*
|
1550
1591
|
* @param {!string} name The name of the module to create or retrieve.
|
1551
1592
|
* @param {Array.<string>=} requires If specified then new module is being created. If
|
1552
|
-
* unspecified then the
|
1593
|
+
* unspecified then the module is being retrieved for further configuration.
|
1553
1594
|
* @param {Function} configFn Optional configuration function for the module. Same as
|
1554
1595
|
* {@link angular.Module#config Module#config()}.
|
1555
1596
|
* @returns {module} new module with the {@link angular.Module} api.
|
@@ -1590,7 +1631,6 @@ function setupModuleLoader(window) {
|
|
1590
1631
|
* @ngdoc property
|
1591
1632
|
* @name angular.Module#requires
|
1592
1633
|
* @module ng
|
1593
|
-
* @propertyOf angular.Module
|
1594
1634
|
* @returns {Array.<string>} List of module names which must be loaded before this module.
|
1595
1635
|
* @description
|
1596
1636
|
* Holds the list of modules which the injector will load before the current module is
|
@@ -1602,7 +1642,6 @@ function setupModuleLoader(window) {
|
|
1602
1642
|
* @ngdoc property
|
1603
1643
|
* @name angular.Module#name
|
1604
1644
|
* @module ng
|
1605
|
-
* @propertyOf angular.Module
|
1606
1645
|
* @returns {string} Name of the module.
|
1607
1646
|
* @description
|
1608
1647
|
*/
|
@@ -1880,11 +1919,11 @@ function setupModuleLoader(window) {
|
|
1880
1919
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
1881
1920
|
*/
|
1882
1921
|
var version = {
|
1883
|
-
full: '1.2.
|
1922
|
+
full: '1.2.15', // all of these placeholder strings will be replaced by grunt's
|
1884
1923
|
major: 1, // package task
|
1885
1924
|
minor: 2,
|
1886
|
-
dot:
|
1887
|
-
codeName: '
|
1925
|
+
dot: 15,
|
1926
|
+
codeName: 'beer-underestimating'
|
1888
1927
|
};
|
1889
1928
|
|
1890
1929
|
|
@@ -2372,11 +2411,15 @@ function jqLiteInheritedData(element, name, value) {
|
|
2372
2411
|
var names = isArray(name) ? name : [name];
|
2373
2412
|
|
2374
2413
|
while (element.length) {
|
2375
|
-
|
2414
|
+
var node = element[0];
|
2376
2415
|
for (var i = 0, ii = names.length; i < ii; i++) {
|
2377
2416
|
if ((value = element.data(names[i])) !== undefined) return value;
|
2378
2417
|
}
|
2379
|
-
|
2418
|
+
|
2419
|
+
// If dealing with a document fragment node with a host element, and no parent, use the host
|
2420
|
+
// element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM
|
2421
|
+
// to lookup parent controllers.
|
2422
|
+
element = jqLite(node.parentNode || (node.nodeType === 11 && node.host));
|
2380
2423
|
}
|
2381
2424
|
}
|
2382
2425
|
|
@@ -2465,7 +2508,7 @@ forEach({
|
|
2465
2508
|
return jqLite(element).data('$isolateScope') || jqLite(element).data('$isolateScopeNoTemplate');
|
2466
2509
|
},
|
2467
2510
|
|
2468
|
-
controller: jqLiteController
|
2511
|
+
controller: jqLiteController,
|
2469
2512
|
|
2470
2513
|
injector: function(element) {
|
2471
2514
|
return jqLiteInheritedData(element, '$injector');
|
@@ -4338,7 +4381,6 @@ function Browser(window, document, $log, $sniffer) {
|
|
4338
4381
|
|
4339
4382
|
/**
|
4340
4383
|
* @name $browser#onUrlChange
|
4341
|
-
* @TODO(vojta): refactor to use node's syntax for events
|
4342
4384
|
*
|
4343
4385
|
* @description
|
4344
4386
|
* Register callback function that will be called, when url changes.
|
@@ -4359,6 +4401,7 @@ function Browser(window, document, $log, $sniffer) {
|
|
4359
4401
|
* @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous.
|
4360
4402
|
*/
|
4361
4403
|
self.onUrlChange = function(callback) {
|
4404
|
+
// TODO(vojta): refactor to use node's syntax for events
|
4362
4405
|
if (!urlChangeInit) {
|
4363
4406
|
// We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera)
|
4364
4407
|
// don't fire popstate when user change the address bar and don't fire hashchange when url
|
@@ -4735,15 +4778,11 @@ function $CacheFactoryProvider() {
|
|
4735
4778
|
* `$templateCache` service directly.
|
4736
4779
|
*
|
4737
4780
|
* Adding via the `script` tag:
|
4781
|
+
*
|
4738
4782
|
* ```html
|
4739
|
-
*
|
4740
|
-
*
|
4741
|
-
*
|
4742
|
-
* This is the content of the template
|
4743
|
-
* </script>
|
4744
|
-
* </head>
|
4745
|
-
* ...
|
4746
|
-
* </html>
|
4783
|
+
* <script type="text/ng-template" id="templateId.html">
|
4784
|
+
* <p>This is the content of the template</p>
|
4785
|
+
* </script>
|
4747
4786
|
* ```
|
4748
4787
|
*
|
4749
4788
|
* **Note:** the `script` tag containing the template does not need to be included in the `head` of
|
@@ -5280,7 +5319,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
5280
5319
|
Suffix = 'Directive',
|
5281
5320
|
COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/,
|
5282
5321
|
CLASS_DIRECTIVE_REGEXP = /(([\d\w\-_]+)(?:\:([^;]+))?;?)/,
|
5283
|
-
TABLE_CONTENT_REGEXP = /^<\s*(tr|th|td|tbody)(\s+[^>]*)?>/i;
|
5322
|
+
TABLE_CONTENT_REGEXP = /^<\s*(tr|th|td|thead|tbody|tfoot)(\s+[^>]*)?>/i;
|
5284
5323
|
|
5285
5324
|
// Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes
|
5286
5325
|
// The assumption is that future DOM event attribute names will begin with
|
@@ -6426,16 +6465,15 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
6426
6465
|
template = trim(template);
|
6427
6466
|
if ((type = TABLE_CONTENT_REGEXP.exec(template))) {
|
6428
6467
|
type = type[1].toLowerCase();
|
6429
|
-
var table = jqLite('<table>' + template + '</table>')
|
6430
|
-
|
6431
|
-
|
6432
|
-
if (tbody.length && type !== 'tbody') {
|
6433
|
-
table = tbody;
|
6468
|
+
var table = jqLite('<table>' + template + '</table>');
|
6469
|
+
if (/(thead|tbody|tfoot)/.test(type)) {
|
6470
|
+
return table.children(type);
|
6434
6471
|
}
|
6435
|
-
|
6436
|
-
|
6472
|
+
table = table.children('tbody');
|
6473
|
+
if (type === 'tr') {
|
6474
|
+
return table.children('tr');
|
6437
6475
|
}
|
6438
|
-
return table.contents();
|
6476
|
+
return table.children('tr').contents();
|
6439
6477
|
}
|
6440
6478
|
return jqLite('<div>' +
|
6441
6479
|
template +
|
@@ -6905,6 +6943,22 @@ function $ControllerProvider() {
|
|
6905
6943
|
*
|
6906
6944
|
* @description
|
6907
6945
|
* A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object.
|
6946
|
+
*
|
6947
|
+
* @example
|
6948
|
+
<example>
|
6949
|
+
<file name="index.html">
|
6950
|
+
<div ng-controller="MainCtrl">
|
6951
|
+
<p>$document title: <b ng-bind="title"></b></p>
|
6952
|
+
<p>window.document title: <b ng-bind="windowTitle"></b></p>
|
6953
|
+
</div>
|
6954
|
+
</file>
|
6955
|
+
<file name="script.js">
|
6956
|
+
function MainCtrl($scope, $document) {
|
6957
|
+
$scope.title = $document[0].title;
|
6958
|
+
$scope.windowTitle = angular.element(window.document)[0].title;
|
6959
|
+
}
|
6960
|
+
</file>
|
6961
|
+
</example>
|
6908
6962
|
*/
|
6909
6963
|
function $DocumentProvider(){
|
6910
6964
|
this.$get = ['$window', function(window){
|
@@ -7055,7 +7109,7 @@ function $HttpProvider() {
|
|
7055
7109
|
|
7056
7110
|
// transform outgoing request data
|
7057
7111
|
transformRequest: [function(d) {
|
7058
|
-
return isObject(d) && !isFile(d) ? toJson(d) : d;
|
7112
|
+
return isObject(d) && !isFile(d) && !isBlob(d) ? toJson(d) : d;
|
7059
7113
|
}],
|
7060
7114
|
|
7061
7115
|
// default headers
|
@@ -7188,9 +7242,8 @@ function $HttpProvider() {
|
|
7188
7242
|
*
|
7189
7243
|
* # Shortcut methods
|
7190
7244
|
*
|
7191
|
-
*
|
7192
|
-
*
|
7193
|
-
* were created:
|
7245
|
+
* Shortcut methods are also available. All shortcut methods require passing in the URL, and
|
7246
|
+
* request data must be passed in for POST/PUT requests.
|
7194
7247
|
*
|
7195
7248
|
* ```js
|
7196
7249
|
* $http.get('/someUrl').success(successCallback);
|
@@ -7525,7 +7578,7 @@ function $HttpProvider() {
|
|
7525
7578
|
* - **headers** – `{function([headerName])}` – Header getter function.
|
7526
7579
|
* - **config** – `{Object}` – The configuration object that was used to generate the request.
|
7527
7580
|
*
|
7528
|
-
* @property {Array
|
7581
|
+
* @property {Array.<Object>} pendingRequests Array of config objects for currently pending
|
7529
7582
|
* requests. This is primarily meant to be used for debugging purposes.
|
7530
7583
|
*
|
7531
7584
|
*
|
@@ -7827,7 +7880,6 @@ function $HttpProvider() {
|
|
7827
7880
|
/**
|
7828
7881
|
* @ngdoc property
|
7829
7882
|
* @name $http#defaults
|
7830
|
-
* @propertyOf ng.$http
|
7831
7883
|
*
|
7832
7884
|
* @description
|
7833
7885
|
* Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of
|
@@ -8132,9 +8184,11 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
|
|
8132
8184
|
jsonpDone = xhr = null;
|
8133
8185
|
|
8134
8186
|
// fix status code when it is 0 (0 status is undocumented).
|
8135
|
-
// Occurs when accessing file resources.
|
8136
|
-
//
|
8137
|
-
|
8187
|
+
// Occurs when accessing file resources or on Android 4.1 stock browser
|
8188
|
+
// while retrieving files from application cache.
|
8189
|
+
if (status === 0) {
|
8190
|
+
status = response ? 200 : urlResolve(url).protocol == 'file' ? 404 : 0;
|
8191
|
+
}
|
8138
8192
|
|
8139
8193
|
// normalize IE bug (http://bugs.jquery.com/ticket/1450)
|
8140
8194
|
status = status == 1223 ? 204 : status;
|
@@ -8578,7 +8632,7 @@ function $IntervalProvider() {
|
|
8578
8632
|
* @description
|
8579
8633
|
* Cancels a task associated with the `promise`.
|
8580
8634
|
*
|
8581
|
-
* @param {
|
8635
|
+
* @param {promise} promise returned by the `$interval` function.
|
8582
8636
|
* @returns {boolean} Returns `true` if the task was successfully canceled.
|
8583
8637
|
*/
|
8584
8638
|
interval.cancel = function(promise) {
|
@@ -10904,7 +10958,7 @@ function $ParseProvider() {
|
|
10904
10958
|
*
|
10905
10959
|
* Because `finally` is a reserved word in JavaScript and reserved keywords are not supported as
|
10906
10960
|
* property names by ES3, you'll need to invoke the method like `promise['finally'](callback)` to
|
10907
|
-
* make your code IE8 compatible.
|
10961
|
+
* make your code IE8 and Android 2.x compatible.
|
10908
10962
|
*
|
10909
10963
|
* # Chaining promises
|
10910
10964
|
*
|
@@ -11317,21 +11371,32 @@ function qFactory(nextTick, exceptionHandler) {
|
|
11317
11371
|
}
|
11318
11372
|
|
11319
11373
|
function $$RAFProvider(){ //rAF
|
11320
|
-
this.$get = ['$window', function($window) {
|
11374
|
+
this.$get = ['$window', '$timeout', function($window, $timeout) {
|
11321
11375
|
var requestAnimationFrame = $window.requestAnimationFrame ||
|
11322
|
-
$window.webkitRequestAnimationFrame
|
11376
|
+
$window.webkitRequestAnimationFrame ||
|
11377
|
+
$window.mozRequestAnimationFrame;
|
11323
11378
|
|
11324
11379
|
var cancelAnimationFrame = $window.cancelAnimationFrame ||
|
11325
|
-
$window.webkitCancelAnimationFrame
|
11326
|
-
|
11327
|
-
|
11328
|
-
|
11329
|
-
|
11330
|
-
|
11331
|
-
|
11332
|
-
|
11380
|
+
$window.webkitCancelAnimationFrame ||
|
11381
|
+
$window.mozCancelAnimationFrame ||
|
11382
|
+
$window.webkitCancelRequestAnimationFrame;
|
11383
|
+
|
11384
|
+
var rafSupported = !!requestAnimationFrame;
|
11385
|
+
var raf = rafSupported
|
11386
|
+
? function(fn) {
|
11387
|
+
var id = requestAnimationFrame(fn);
|
11388
|
+
return function() {
|
11389
|
+
cancelAnimationFrame(id);
|
11390
|
+
};
|
11391
|
+
}
|
11392
|
+
: function(fn) {
|
11393
|
+
var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666
|
11394
|
+
return function() {
|
11395
|
+
$timeout.cancel(timer);
|
11396
|
+
};
|
11397
|
+
};
|
11333
11398
|
|
11334
|
-
raf.supported =
|
11399
|
+
raf.supported = rafSupported;
|
11335
11400
|
|
11336
11401
|
return raf;
|
11337
11402
|
}];
|
@@ -11476,7 +11541,6 @@ function $RootScopeProvider(){
|
|
11476
11541
|
/**
|
11477
11542
|
* @ngdoc property
|
11478
11543
|
* @name $rootScope.Scope#$id
|
11479
|
-
* @propertyOf ng.$rootScope.Scope
|
11480
11544
|
* @returns {number} Unique scope ID (monotonically increasing alphanumeric sequence) useful for
|
11481
11545
|
* debugging.
|
11482
11546
|
*/
|
@@ -11736,30 +11800,40 @@ function $RootScopeProvider(){
|
|
11736
11800
|
* {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the
|
11737
11801
|
* collection will trigger a call to the `listener`.
|
11738
11802
|
*
|
11739
|
-
* @param {function(newCollection, oldCollection, scope)} listener a callback function
|
11740
|
-
*
|
11741
|
-
* The `newCollection` object is the newly modified data obtained from the `obj` expression
|
11742
|
-
*
|
11743
|
-
*
|
11803
|
+
* @param {function(newCollection, oldCollection, scope)} listener a callback function called
|
11804
|
+
* when a change is detected.
|
11805
|
+
* - The `newCollection` object is the newly modified data obtained from the `obj` expression
|
11806
|
+
* - The `oldCollection` object is a copy of the former collection data.
|
11807
|
+
* Due to performance considerations, the`oldCollection` value is computed only if the
|
11808
|
+
* `listener` function declares two or more arguments.
|
11809
|
+
* - The `scope` argument refers to the current scope.
|
11744
11810
|
*
|
11745
11811
|
* @returns {function()} Returns a de-registration function for this listener. When the
|
11746
11812
|
* de-registration function is executed, the internal watch operation is terminated.
|
11747
11813
|
*/
|
11748
11814
|
$watchCollection: function(obj, listener) {
|
11749
11815
|
var self = this;
|
11750
|
-
|
11816
|
+
// the current value, updated on each dirty-check run
|
11751
11817
|
var newValue;
|
11818
|
+
// a shallow copy of the newValue from the last dirty-check run,
|
11819
|
+
// updated to match newValue during dirty-check run
|
11820
|
+
var oldValue;
|
11821
|
+
// a shallow copy of the newValue from when the last change happened
|
11822
|
+
var veryOldValue;
|
11823
|
+
// only track veryOldValue if the listener is asking for it
|
11824
|
+
var trackVeryOldValue = (listener.length > 1);
|
11752
11825
|
var changeDetected = 0;
|
11753
11826
|
var objGetter = $parse(obj);
|
11754
11827
|
var internalArray = [];
|
11755
11828
|
var internalObject = {};
|
11829
|
+
var initRun = true;
|
11756
11830
|
var oldLength = 0;
|
11757
11831
|
|
11758
11832
|
function $watchCollectionWatch() {
|
11759
11833
|
newValue = objGetter(self);
|
11760
11834
|
var newLength, key;
|
11761
11835
|
|
11762
|
-
if (!isObject(newValue)) {
|
11836
|
+
if (!isObject(newValue)) { // if primitive
|
11763
11837
|
if (oldValue !== newValue) {
|
11764
11838
|
oldValue = newValue;
|
11765
11839
|
changeDetected++;
|
@@ -11781,7 +11855,9 @@ function $RootScopeProvider(){
|
|
11781
11855
|
}
|
11782
11856
|
// copy the items to oldValue and look for changes.
|
11783
11857
|
for (var i = 0; i < newLength; i++) {
|
11784
|
-
|
11858
|
+
var bothNaN = (oldValue[i] !== oldValue[i]) &&
|
11859
|
+
(newValue[i] !== newValue[i]);
|
11860
|
+
if (!bothNaN && (oldValue[i] !== newValue[i])) {
|
11785
11861
|
changeDetected++;
|
11786
11862
|
oldValue[i] = newValue[i];
|
11787
11863
|
}
|
@@ -11825,7 +11901,32 @@ function $RootScopeProvider(){
|
|
11825
11901
|
}
|
11826
11902
|
|
11827
11903
|
function $watchCollectionAction() {
|
11828
|
-
|
11904
|
+
if (initRun) {
|
11905
|
+
initRun = false;
|
11906
|
+
listener(newValue, newValue, self);
|
11907
|
+
} else {
|
11908
|
+
listener(newValue, veryOldValue, self);
|
11909
|
+
}
|
11910
|
+
|
11911
|
+
// make a copy for the next time a collection is changed
|
11912
|
+
if (trackVeryOldValue) {
|
11913
|
+
if (!isObject(newValue)) {
|
11914
|
+
//primitive
|
11915
|
+
veryOldValue = newValue;
|
11916
|
+
} else if (isArrayLike(newValue)) {
|
11917
|
+
veryOldValue = new Array(newValue.length);
|
11918
|
+
for (var i = 0; i < newValue.length; i++) {
|
11919
|
+
veryOldValue[i] = newValue[i];
|
11920
|
+
}
|
11921
|
+
} else { // if object
|
11922
|
+
veryOldValue = {};
|
11923
|
+
for (var key in newValue) {
|
11924
|
+
if (hasOwnProperty.call(newValue, key)) {
|
11925
|
+
veryOldValue[key] = newValue[key];
|
11926
|
+
}
|
11927
|
+
}
|
11928
|
+
}
|
11929
|
+
}
|
11829
11930
|
}
|
11830
11931
|
|
11831
11932
|
return this.$watch($watchCollectionWatch, $watchCollectionAction);
|
@@ -11989,7 +12090,6 @@ function $RootScopeProvider(){
|
|
11989
12090
|
/**
|
11990
12091
|
* @ngdoc event
|
11991
12092
|
* @name $rootScope.Scope#$destroy
|
11992
|
-
* @eventOf ng.$rootScope.Scope
|
11993
12093
|
* @eventType broadcast on scope being destroyed
|
11994
12094
|
*
|
11995
12095
|
* @description
|
@@ -12207,7 +12307,7 @@ function $RootScopeProvider(){
|
|
12207
12307
|
* - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called.
|
12208
12308
|
*
|
12209
12309
|
* @param {string} name Event name to listen on.
|
12210
|
-
* @param {function(event, args
|
12310
|
+
* @param {function(event, ...args)} listener Function to call when the event is emitted.
|
12211
12311
|
* @returns {function()} Returns a deregistration function for this listener.
|
12212
12312
|
*/
|
12213
12313
|
$on: function(name, listener) {
|
@@ -13008,7 +13108,7 @@ function $SceDelegateProvider() {
|
|
13008
13108
|
* |---------------------|----------------|
|
13009
13109
|
* | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. |
|
13010
13110
|
* | `$sce.CSS` | For CSS that's safe to source into the application. Currently unused. Feel free to use it in your own directives. |
|
13011
|
-
* | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`<a href=` and `<img src=` sanitize their urls and don't
|
13111
|
+
* | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`<a href=` and `<img src=` sanitize their urls and don't constitute an SCE context. |
|
13012
13112
|
* | `$sce.RESOURCE_URL` | For URLs that are not only safe to follow as links, but whose contens are also safe to include in your application. Examples include `ng-include`, `src` / `ngSrc` bindings for tags other than `IMG` (e.g. `IFRAME`, `OBJECT`, etc.) <br><br>Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. |
|
13013
13113
|
* | `$sce.JS` | For JavaScript that is safe to execute in your application's context. Currently unused. Feel free to use it in your own directives. |
|
13014
13114
|
*
|
@@ -14655,7 +14755,7 @@ function dateFilter($locale) {
|
|
14655
14755
|
* @returns {string} JSON string.
|
14656
14756
|
*
|
14657
14757
|
*
|
14658
|
-
* @example
|
14758
|
+
* @example
|
14659
14759
|
<example>
|
14660
14760
|
<file name="index.html">
|
14661
14761
|
<pre>{{ {'name':'value'} | json }}</pre>
|
@@ -14879,6 +14979,12 @@ function orderByFilter($parse){
|
|
14879
14979
|
predicate = predicate.substring(1);
|
14880
14980
|
}
|
14881
14981
|
get = $parse(predicate);
|
14982
|
+
if (get.constant) {
|
14983
|
+
var key = get();
|
14984
|
+
return reverseComparator(function(a,b) {
|
14985
|
+
return compare(a[key], b[key]);
|
14986
|
+
}, descending);
|
14987
|
+
}
|
14882
14988
|
}
|
14883
14989
|
return reverseComparator(function(a,b){
|
14884
14990
|
return compare(get(a),get(b));
|
@@ -15252,7 +15358,7 @@ var htmlAnchorDirective = valueFn({
|
|
15252
15358
|
* such as selected. (Their presence means true and their absence means false.)
|
15253
15359
|
* If we put an Angular interpolation expression into such an attribute then the
|
15254
15360
|
* binding information would be lost when the browser removes the attribute.
|
15255
|
-
* The `ngSelected` directive solves this problem for the `selected`
|
15361
|
+
* The `ngSelected` directive solves this problem for the `selected` attribute.
|
15256
15362
|
* This complementary directive is not removed by the browser and so provides
|
15257
15363
|
* a permanent reliable place to store the binding information.
|
15258
15364
|
*
|
@@ -15731,8 +15837,6 @@ function FormController(element, attrs, $scope, $animate) {
|
|
15731
15837
|
</file>
|
15732
15838
|
</example>
|
15733
15839
|
*
|
15734
|
-
* @param {string=} name Name of the form. If specified, the form controller will be published into
|
15735
|
-
* related scope, under this name.
|
15736
15840
|
*/
|
15737
15841
|
var formDirectiveFactory = function(isNgForm) {
|
15738
15842
|
return ['$timeout', function($timeout) {
|
@@ -17400,7 +17504,7 @@ var ngValueDirective = function() {
|
|
17400
17504
|
* Typically, you don't use `ngBind` directly, but instead you use the double curly markup like
|
17401
17505
|
* `{{ expression }}` which is similar but less verbose.
|
17402
17506
|
*
|
17403
|
-
* It is
|
17507
|
+
* It is preferable to use `ngBind` instead of `{{ expression }}` when a template is momentarily
|
17404
17508
|
* displayed by the browser in its raw state before Angular compiles it. Since `ngBind` is an
|
17405
17509
|
* element attribute, it makes the bindings invisible to the user while the page is loading.
|
17406
17510
|
*
|
@@ -18772,7 +18876,7 @@ var ngIfDirective = ['$animate', function($animate) {
|
|
18772
18876
|
* @priority 400
|
18773
18877
|
*
|
18774
18878
|
* @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant,
|
18775
|
-
* make sure you wrap it in quotes, e.g. `src="'myPartialTemplate.html'"`.
|
18879
|
+
* make sure you wrap it in **single** quotes, e.g. `src="'myPartialTemplate.html'"`.
|
18776
18880
|
* @param {string=} onload Expression to evaluate when a new partial is loaded.
|
18777
18881
|
*
|
18778
18882
|
* @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll
|
@@ -18886,7 +18990,6 @@ var ngIfDirective = ['$animate', function($animate) {
|
|
18886
18990
|
/**
|
18887
18991
|
* @ngdoc event
|
18888
18992
|
* @name ngInclude#$includeContentRequested
|
18889
|
-
* @eventOf ng.directive:ngInclude
|
18890
18993
|
* @eventType emit on the scope ngInclude was declared in
|
18891
18994
|
* @description
|
18892
18995
|
* Emitted every time the ngInclude content is requested.
|
@@ -18896,7 +18999,6 @@ var ngIfDirective = ['$animate', function($animate) {
|
|
18896
18999
|
/**
|
18897
19000
|
* @ngdoc event
|
18898
19001
|
* @name ngInclude#$includeContentLoaded
|
18899
|
-
* @eventOf ng.directive:ngInclude
|
18900
19002
|
* @eventType emit on the current ngInclude scope
|
18901
19003
|
* @description
|
18902
19004
|
* Emitted every time the ngInclude content is reloaded.
|
@@ -19383,9 +19485,11 @@ var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interp
|
|
19383
19485
|
* as **data-ng-repeat-start**, **x-ng-repeat-start** and **ng:repeat-start**).
|
19384
19486
|
*
|
19385
19487
|
* @animations
|
19386
|
-
* enter - when a new item is added to the list or when an item is revealed after a filter
|
19387
|
-
*
|
19388
|
-
*
|
19488
|
+
* **.enter** - when a new item is added to the list or when an item is revealed after a filter
|
19489
|
+
*
|
19490
|
+
* **.leave** - when an item is removed from the list or when an item is filtered out
|
19491
|
+
*
|
19492
|
+
* **.move** - when an adjacent item is filtered out causing a reorder or when the item contents are reordered
|
19389
19493
|
*
|
19390
19494
|
* @element ANY
|
19391
19495
|
* @scope
|
@@ -20117,7 +20221,6 @@ var ngStyleDirective = ngDirective(function(scope, element, attr) {
|
|
20117
20221
|
* @scope
|
20118
20222
|
* @priority 800
|
20119
20223
|
* @param {*} ngSwitch|on expression to match against <tt>ng-switch-when</tt>.
|
20120
|
-
* @paramDescription
|
20121
20224
|
* On child elements add:
|
20122
20225
|
*
|
20123
20226
|
* * `ngSwitchWhen`: the case statement to match against. If match then this
|
@@ -20366,7 +20469,7 @@ var ngTranscludeDirective = ngDirective({
|
|
20366
20469
|
* `<script>` element must be specified as `text/ng-template`, and a cache name for the template must be
|
20367
20470
|
* assigned through the element's `id`, which can then be used as a directive's `templateUrl`.
|
20368
20471
|
*
|
20369
|
-
* @param {
|
20472
|
+
* @param {string} type Must be set to `'text/ng-template'`.
|
20370
20473
|
* @param {string} id Cache name of the template.
|
20371
20474
|
*
|
20372
20475
|
* @example
|
@@ -20797,6 +20900,12 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
20797
20900
|
value = valueFn(scope, locals);
|
20798
20901
|
}
|
20799
20902
|
}
|
20903
|
+
// Update the null option's selected property here so $render cleans it up correctly
|
20904
|
+
if (optionGroupsCache[0].length > 1) {
|
20905
|
+
if (optionGroupsCache[0][1].id !== key) {
|
20906
|
+
optionGroupsCache[0][1].selected = false;
|
20907
|
+
}
|
20908
|
+
}
|
20800
20909
|
}
|
20801
20910
|
ctrl.$setViewValue(value);
|
20802
20911
|
});
|
@@ -20934,7 +21043,7 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
20934
21043
|
lastElement.val(existingOption.id = option.id);
|
20935
21044
|
}
|
20936
21045
|
// lastElement.prop('selected') provided by jQuery has side-effects
|
20937
|
-
if (
|
21046
|
+
if (existingOption.selected !== option.selected) {
|
20938
21047
|
lastElement.prop('selected', (existingOption.selected = option.selected));
|
20939
21048
|
}
|
20940
21049
|
} else {
|
@@ -21038,6 +21147,12 @@ var styleDirective = valueFn({
|
|
21038
21147
|
terminal: true
|
21039
21148
|
});
|
21040
21149
|
|
21150
|
+
if (window.angular.bootstrap) {
|
21151
|
+
//AngularJS is already loaded, so we can return here...
|
21152
|
+
console.log('WARNING: Tried to load angular more than once.');
|
21153
|
+
return;
|
21154
|
+
}
|
21155
|
+
|
21041
21156
|
//try to bind to jquery now so that one can write angular.element().read()
|
21042
21157
|
//but we will rebind on bootstrap again.
|
21043
21158
|
bindJQuery();
|