angularjs-rails 1.6.1 → 1.6.2
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 +1 -1
- data/vendor/assets/javascripts/angular-animate.js +85 -89
- data/vendor/assets/javascripts/angular-aria.js +3 -3
- data/vendor/assets/javascripts/angular-cookies.js +2 -2
- data/vendor/assets/javascripts/angular-loader.js +3 -3
- data/vendor/assets/javascripts/angular-message-format.js +2 -2
- data/vendor/assets/javascripts/angular-messages.js +2 -2
- data/vendor/assets/javascripts/angular-mocks.js +37 -22
- data/vendor/assets/javascripts/angular-parse-ext.js +2 -2
- data/vendor/assets/javascripts/angular-resource.js +18 -16
- data/vendor/assets/javascripts/angular-route.js +15 -3
- data/vendor/assets/javascripts/angular-sanitize.js +2 -2
- data/vendor/assets/javascripts/angular-scenario.js +426 -274
- data/vendor/assets/javascripts/angular-touch.js +2 -2
- data/vendor/assets/javascripts/angular.js +425 -273
- metadata +2 -2
@@ -1,6 +1,6 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.6.
|
3
|
-
* (c) 2010-
|
2
|
+
* @license AngularJS v1.6.2
|
3
|
+
* (c) 2010-2017 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
6
6
|
(function(window) {'use strict';
|
@@ -57,7 +57,7 @@ function minErr(module, ErrorConstructor) {
|
|
57
57
|
return match;
|
58
58
|
});
|
59
59
|
|
60
|
-
message += '\nhttp://errors.angularjs.org/1.6.
|
60
|
+
message += '\nhttp://errors.angularjs.org/1.6.2/' +
|
61
61
|
(module ? module + '/' : '') + code;
|
62
62
|
|
63
63
|
for (i = SKIP_INDEXES, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') {
|
@@ -1548,12 +1548,16 @@ function getNgAttribute(element, ngAttr) {
|
|
1548
1548
|
}
|
1549
1549
|
|
1550
1550
|
function allowAutoBootstrap(document) {
|
1551
|
-
|
1551
|
+
var script = document.currentScript;
|
1552
|
+
var src = script && script.getAttribute('src');
|
1553
|
+
|
1554
|
+
if (!src) {
|
1552
1555
|
return true;
|
1553
1556
|
}
|
1554
|
-
|
1557
|
+
|
1555
1558
|
var link = document.createElement('a');
|
1556
1559
|
link.href = src;
|
1560
|
+
|
1557
1561
|
if (document.location.origin === link.origin) {
|
1558
1562
|
// Same-origin resources are always allowed, even for non-whitelisted schemes.
|
1559
1563
|
return true;
|
@@ -1935,7 +1939,7 @@ function bindJQuery() {
|
|
1935
1939
|
extend(jQuery.fn, {
|
1936
1940
|
scope: JQLitePrototype.scope,
|
1937
1941
|
isolateScope: JQLitePrototype.isolateScope,
|
1938
|
-
controller: JQLitePrototype.controller,
|
1942
|
+
controller: /** @type {?} */ (JQLitePrototype).controller,
|
1939
1943
|
injector: JQLitePrototype.injector,
|
1940
1944
|
inheritedData: JQLitePrototype.inheritedData
|
1941
1945
|
});
|
@@ -2577,7 +2581,6 @@ function toDebugString(obj) {
|
|
2577
2581
|
$$ForceReflowProvider,
|
2578
2582
|
$InterpolateProvider,
|
2579
2583
|
$IntervalProvider,
|
2580
|
-
$$HashMapProvider,
|
2581
2584
|
$HttpProvider,
|
2582
2585
|
$HttpParamSerializerProvider,
|
2583
2586
|
$HttpParamSerializerJQLikeProvider,
|
@@ -2586,6 +2589,7 @@ function toDebugString(obj) {
|
|
2586
2589
|
$jsonpCallbacksProvider,
|
2587
2590
|
$LocationProvider,
|
2588
2591
|
$LogProvider,
|
2592
|
+
$$MapProvider,
|
2589
2593
|
$ParseProvider,
|
2590
2594
|
$RootScopeProvider,
|
2591
2595
|
$QProvider,
|
@@ -2623,11 +2627,11 @@ function toDebugString(obj) {
|
|
2623
2627
|
var version = {
|
2624
2628
|
// These placeholder strings will be replaced by grunt's `build` task.
|
2625
2629
|
// They need to be double- or single-quoted.
|
2626
|
-
full: '1.6.
|
2630
|
+
full: '1.6.2',
|
2627
2631
|
major: 1,
|
2628
2632
|
minor: 6,
|
2629
|
-
dot:
|
2630
|
-
codeName: '
|
2633
|
+
dot: 2,
|
2634
|
+
codeName: 'llamacorn-lovehug'
|
2631
2635
|
};
|
2632
2636
|
|
2633
2637
|
|
@@ -2767,7 +2771,7 @@ function publishExternalAPI(angular) {
|
|
2767
2771
|
$window: $WindowProvider,
|
2768
2772
|
$$rAF: $$RAFProvider,
|
2769
2773
|
$$jqLite: $$jqLiteProvider,
|
2770
|
-
$$
|
2774
|
+
$$Map: $$MapProvider,
|
2771
2775
|
$$cookieReader: $$CookieReaderProvider
|
2772
2776
|
});
|
2773
2777
|
}
|
@@ -3915,50 +3919,70 @@ function hashKey(obj, nextUidFn) {
|
|
3915
3919
|
return key;
|
3916
3920
|
}
|
3917
3921
|
|
3918
|
-
|
3919
|
-
|
3920
|
-
|
3921
|
-
|
3922
|
-
|
3923
|
-
|
3924
|
-
|
3925
|
-
|
3926
|
-
|
3927
|
-
|
3928
|
-
forEach(array, this.put, this);
|
3922
|
+
// A minimal ES2015 Map implementation.
|
3923
|
+
// Should be bug/feature equivalent to the native implementations of supported browsers
|
3924
|
+
// (for the features required in Angular).
|
3925
|
+
// See https://kangax.github.io/compat-table/es6/#test-Map
|
3926
|
+
var nanKey = Object.create(null);
|
3927
|
+
function NgMapShim() {
|
3928
|
+
this._keys = [];
|
3929
|
+
this._values = [];
|
3930
|
+
this._lastKey = NaN;
|
3931
|
+
this._lastIndex = -1;
|
3929
3932
|
}
|
3930
|
-
|
3931
|
-
|
3932
|
-
|
3933
|
-
|
3934
|
-
|
3935
|
-
|
3936
|
-
|
3937
|
-
|
3933
|
+
NgMapShim.prototype = {
|
3934
|
+
_idx: function(key) {
|
3935
|
+
if (key === this._lastKey) {
|
3936
|
+
return this._lastIndex;
|
3937
|
+
}
|
3938
|
+
this._lastKey = key;
|
3939
|
+
this._lastIndex = this._keys.indexOf(key);
|
3940
|
+
return this._lastIndex;
|
3941
|
+
},
|
3942
|
+
_transformKey: function(key) {
|
3943
|
+
return isNumberNaN(key) ? nanKey : key;
|
3938
3944
|
},
|
3939
|
-
|
3940
|
-
/**
|
3941
|
-
* @param key
|
3942
|
-
* @returns {Object} the value for the key
|
3943
|
-
*/
|
3944
3945
|
get: function(key) {
|
3945
|
-
|
3946
|
+
key = this._transformKey(key);
|
3947
|
+
var idx = this._idx(key);
|
3948
|
+
if (idx !== -1) {
|
3949
|
+
return this._values[idx];
|
3950
|
+
}
|
3946
3951
|
},
|
3952
|
+
set: function(key, value) {
|
3953
|
+
key = this._transformKey(key);
|
3954
|
+
var idx = this._idx(key);
|
3955
|
+
if (idx === -1) {
|
3956
|
+
idx = this._lastIndex = this._keys.length;
|
3957
|
+
}
|
3958
|
+
this._keys[idx] = key;
|
3959
|
+
this._values[idx] = value;
|
3947
3960
|
|
3948
|
-
|
3949
|
-
|
3950
|
-
|
3951
|
-
|
3952
|
-
|
3953
|
-
var
|
3954
|
-
|
3955
|
-
|
3961
|
+
// Support: IE11
|
3962
|
+
// Do not `return this` to simulate the partial IE11 implementation
|
3963
|
+
},
|
3964
|
+
delete: function(key) {
|
3965
|
+
key = this._transformKey(key);
|
3966
|
+
var idx = this._idx(key);
|
3967
|
+
if (idx === -1) {
|
3968
|
+
return false;
|
3969
|
+
}
|
3970
|
+
this._keys.splice(idx, 1);
|
3971
|
+
this._values.splice(idx, 1);
|
3972
|
+
this._lastKey = NaN;
|
3973
|
+
this._lastIndex = -1;
|
3974
|
+
return true;
|
3956
3975
|
}
|
3957
3976
|
};
|
3958
3977
|
|
3959
|
-
|
3978
|
+
// For now, always use `NgMapShim`, even if `window.Map` is available. Some native implementations
|
3979
|
+
// are still buggy (often in subtle ways) and can cause hard-to-debug failures. When native `Map`
|
3980
|
+
// implementations get more stable, we can reconsider switching to `window.Map` (when available).
|
3981
|
+
var NgMap = NgMapShim;
|
3982
|
+
|
3983
|
+
var $$MapProvider = [/** @this */function() {
|
3960
3984
|
this.$get = [function() {
|
3961
|
-
return
|
3985
|
+
return NgMap;
|
3962
3986
|
}];
|
3963
3987
|
}];
|
3964
3988
|
|
@@ -4033,11 +4057,7 @@ var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
|
|
4033
4057
|
var $injectorMinErr = minErr('$injector');
|
4034
4058
|
|
4035
4059
|
function stringifyFn(fn) {
|
4036
|
-
|
4037
|
-
// Creating a new string by adding `' '` at the end, to hack around some bug in Chrome v50/51
|
4038
|
-
// (See https://github.com/angular/angular.js/issues/14487.)
|
4039
|
-
// TODO (gkalpak): Remove workaround when Chrome v52 is released
|
4040
|
-
return Function.prototype.toString.call(fn) + ' ';
|
4060
|
+
return Function.prototype.toString.call(fn);
|
4041
4061
|
}
|
4042
4062
|
|
4043
4063
|
function extractArgs(fn) {
|
@@ -4611,7 +4631,7 @@ function createInjector(modulesToLoad, strictDi) {
|
|
4611
4631
|
var INSTANTIATING = {},
|
4612
4632
|
providerSuffix = 'Provider',
|
4613
4633
|
path = [],
|
4614
|
-
loadedModules = new
|
4634
|
+
loadedModules = new NgMap(),
|
4615
4635
|
providerCache = {
|
4616
4636
|
$provide: {
|
4617
4637
|
provider: supportObject(provider),
|
@@ -4719,7 +4739,7 @@ function createInjector(modulesToLoad, strictDi) {
|
|
4719
4739
|
var runBlocks = [], moduleFn;
|
4720
4740
|
forEach(modulesToLoad, function(module) {
|
4721
4741
|
if (loadedModules.get(module)) return;
|
4722
|
-
loadedModules.
|
4742
|
+
loadedModules.set(module, true);
|
4723
4743
|
|
4724
4744
|
function runInvokeQueue(queue) {
|
4725
4745
|
var i, ii;
|
@@ -5205,7 +5225,7 @@ var $$CoreAnimateJsProvider = /** @this */ function() {
|
|
5205
5225
|
// this is prefixed with Core since it conflicts with
|
5206
5226
|
// the animateQueueProvider defined in ngAnimate/animateQueue.js
|
5207
5227
|
var $$CoreAnimateQueueProvider = /** @this */ function() {
|
5208
|
-
var postDigestQueue = new
|
5228
|
+
var postDigestQueue = new NgMap();
|
5209
5229
|
var postDigestElements = [];
|
5210
5230
|
|
5211
5231
|
this.$get = ['$$AnimateRunner', '$rootScope',
|
@@ -5284,7 +5304,7 @@ var $$CoreAnimateQueueProvider = /** @this */ function() {
|
|
5284
5304
|
jqLiteRemoveClass(elm, toRemove);
|
5285
5305
|
}
|
5286
5306
|
});
|
5287
|
-
postDigestQueue.
|
5307
|
+
postDigestQueue.delete(element);
|
5288
5308
|
}
|
5289
5309
|
});
|
5290
5310
|
postDigestElements.length = 0;
|
@@ -5299,7 +5319,7 @@ var $$CoreAnimateQueueProvider = /** @this */ function() {
|
|
5299
5319
|
|
5300
5320
|
if (classesAdded || classesRemoved) {
|
5301
5321
|
|
5302
|
-
postDigestQueue.
|
5322
|
+
postDigestQueue.set(element, data);
|
5303
5323
|
postDigestElements.push(element);
|
5304
5324
|
|
5305
5325
|
if (postDigestElements.length === 1) {
|
@@ -6159,7 +6179,6 @@ function Browser(window, document, $log, $sniffer) {
|
|
6159
6179
|
};
|
6160
6180
|
|
6161
6181
|
cacheState();
|
6162
|
-
lastHistoryState = cachedState;
|
6163
6182
|
|
6164
6183
|
/**
|
6165
6184
|
* @name $browser#url
|
@@ -6213,8 +6232,6 @@ function Browser(window, document, $log, $sniffer) {
|
|
6213
6232
|
if ($sniffer.history && (!sameBase || !sameState)) {
|
6214
6233
|
history[replace ? 'replaceState' : 'pushState'](state, '', url);
|
6215
6234
|
cacheState();
|
6216
|
-
// Do the assignment again so that those two variables are referentially identical.
|
6217
|
-
lastHistoryState = cachedState;
|
6218
6235
|
} else {
|
6219
6236
|
if (!sameBase) {
|
6220
6237
|
pendingLocation = url;
|
@@ -6263,8 +6280,7 @@ function Browser(window, document, $log, $sniffer) {
|
|
6263
6280
|
|
6264
6281
|
function cacheStateAndFireUrlChange() {
|
6265
6282
|
pendingLocation = null;
|
6266
|
-
|
6267
|
-
fireUrlChange();
|
6283
|
+
fireStateOrUrlChange();
|
6268
6284
|
}
|
6269
6285
|
|
6270
6286
|
// This variable should be used *only* inside the cacheState function.
|
@@ -6278,11 +6294,16 @@ function Browser(window, document, $log, $sniffer) {
|
|
6278
6294
|
if (equals(cachedState, lastCachedState)) {
|
6279
6295
|
cachedState = lastCachedState;
|
6280
6296
|
}
|
6297
|
+
|
6281
6298
|
lastCachedState = cachedState;
|
6299
|
+
lastHistoryState = cachedState;
|
6282
6300
|
}
|
6283
6301
|
|
6284
|
-
function
|
6285
|
-
|
6302
|
+
function fireStateOrUrlChange() {
|
6303
|
+
var prevLastHistoryState = lastHistoryState;
|
6304
|
+
cacheState();
|
6305
|
+
|
6306
|
+
if (lastBrowserUrl === self.url() && prevLastHistoryState === cachedState) {
|
6286
6307
|
return;
|
6287
6308
|
}
|
6288
6309
|
|
@@ -6348,7 +6369,7 @@ function Browser(window, document, $log, $sniffer) {
|
|
6348
6369
|
* Needs to be exported to be able to check for changes that have been done in sync,
|
6349
6370
|
* as hashchange/popstate events fire in async.
|
6350
6371
|
*/
|
6351
|
-
self.$$checkUrlChange =
|
6372
|
+
self.$$checkUrlChange = fireStateOrUrlChange;
|
6352
6373
|
|
6353
6374
|
//////////////////////////////////////////////////////////////
|
6354
6375
|
// Misc API
|
@@ -6958,7 +6979,8 @@ function $TemplateCacheProvider() {
|
|
6958
6979
|
* * `$onChanges(changesObj)` - Called whenever one-way (`<`) or interpolation (`@`) bindings are updated. The
|
6959
6980
|
* `changesObj` is a hash whose keys are the names of the bound properties that have changed, and the values are an
|
6960
6981
|
* object of the form `{ currentValue, previousValue, isFirstChange() }`. Use this hook to trigger updates within a
|
6961
|
-
* component such as cloning the bound value to prevent accidental mutation of the outer value.
|
6982
|
+
* component such as cloning the bound value to prevent accidental mutation of the outer value. Note that this will
|
6983
|
+
* also be called when your bindings are initialized.
|
6962
6984
|
* * `$doCheck()` - Called on each turn of the digest cycle. Provides an opportunity to detect and act on
|
6963
6985
|
* changes. Any actions that you wish to take in response to the changes that you detect must be
|
6964
6986
|
* invoked from this hook; implementing this has no effect on when `$onChanges` is called. For example, this hook
|
@@ -7813,7 +7835,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
7813
7835
|
var bindingCache = createMap();
|
7814
7836
|
|
7815
7837
|
function parseIsolateBindings(scope, directiveName, isController) {
|
7816
|
-
var LOCAL_REGEXP = /^\s*([@&<]|=(\*?))(\??)\s*(\w*)\s*$/;
|
7838
|
+
var LOCAL_REGEXP = /^\s*([@&<]|=(\*?))(\??)\s*([\w$]*)\s*$/;
|
7817
7839
|
|
7818
7840
|
var bindings = createMap();
|
7819
7841
|
|
@@ -9985,7 +10007,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
9985
10007
|
if (error instanceof Error) {
|
9986
10008
|
$exceptionHandler(error);
|
9987
10009
|
}
|
9988
|
-
})
|
10010
|
+
});
|
9989
10011
|
|
9990
10012
|
return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) {
|
9991
10013
|
var childBoundTranscludeFn = boundTranscludeFn;
|
@@ -12117,7 +12139,8 @@ function $HttpProvider() {
|
|
12117
12139
|
if ((config.cache || defaults.cache) && config.cache !== false &&
|
12118
12140
|
(config.method === 'GET' || config.method === 'JSONP')) {
|
12119
12141
|
cache = isObject(config.cache) ? config.cache
|
12120
|
-
|
12142
|
+
: isObject(/** @type {?} */ (defaults).cache)
|
12143
|
+
? /** @type {?} */ (defaults).cache
|
12121
12144
|
: defaultCache;
|
12122
12145
|
}
|
12123
12146
|
|
@@ -13295,6 +13318,8 @@ function LocationHtml5Url(appBase, appBaseNoFile, basePrefix) {
|
|
13295
13318
|
|
13296
13319
|
this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;
|
13297
13320
|
this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/'
|
13321
|
+
|
13322
|
+
this.$$urlUpdatedByLocation = true;
|
13298
13323
|
};
|
13299
13324
|
|
13300
13325
|
this.$$parseLinkUrl = function(url, relHref) {
|
@@ -13372,7 +13397,7 @@ function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) {
|
|
13372
13397
|
withoutHashUrl = '';
|
13373
13398
|
if (isUndefined(withoutBaseUrl)) {
|
13374
13399
|
appBase = url;
|
13375
|
-
this.replace();
|
13400
|
+
/** @type {?} */ (this).replace();
|
13376
13401
|
}
|
13377
13402
|
}
|
13378
13403
|
}
|
@@ -13428,6 +13453,8 @@ function LocationHashbangUrl(appBase, appBaseNoFile, hashPrefix) {
|
|
13428
13453
|
|
13429
13454
|
this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;
|
13430
13455
|
this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : '');
|
13456
|
+
|
13457
|
+
this.$$urlUpdatedByLocation = true;
|
13431
13458
|
};
|
13432
13459
|
|
13433
13460
|
this.$$parseLinkUrl = function(url, relHref) {
|
@@ -13485,6 +13512,8 @@ function LocationHashbangInHtml5Url(appBase, appBaseNoFile, hashPrefix) {
|
|
13485
13512
|
this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;
|
13486
13513
|
// include hashPrefix in $$absUrl when $$url is empty so IE9 does not reload page because of removal of '#'
|
13487
13514
|
this.$$absUrl = appBase + hashPrefix + this.$$url;
|
13515
|
+
|
13516
|
+
this.$$urlUpdatedByLocation = true;
|
13488
13517
|
};
|
13489
13518
|
|
13490
13519
|
}
|
@@ -13814,6 +13843,7 @@ forEach([LocationHashbangInHtml5Url, LocationHashbangUrl, LocationHtml5Url], fun
|
|
13814
13843
|
// but we're changing the $$state reference to $browser.state() during the $digest
|
13815
13844
|
// so the modification window is narrow.
|
13816
13845
|
this.$$state = isUndefined(state) ? null : state;
|
13846
|
+
this.$$urlUpdatedByLocation = true;
|
13817
13847
|
|
13818
13848
|
return this;
|
13819
13849
|
};
|
@@ -14126,36 +14156,40 @@ function $LocationProvider() {
|
|
14126
14156
|
|
14127
14157
|
// update browser
|
14128
14158
|
$rootScope.$watch(function $locationWatch() {
|
14129
|
-
|
14130
|
-
|
14131
|
-
var oldState = $browser.state();
|
14132
|
-
var currentReplace = $location.$$replace;
|
14133
|
-
var urlOrStateChanged = oldUrl !== newUrl ||
|
14134
|
-
($location.$$html5 && $sniffer.history && oldState !== $location.$$state);
|
14159
|
+
if (initializing || $location.$$urlUpdatedByLocation) {
|
14160
|
+
$location.$$urlUpdatedByLocation = false;
|
14135
14161
|
|
14136
|
-
|
14137
|
-
|
14162
|
+
var oldUrl = trimEmptyHash($browser.url());
|
14163
|
+
var newUrl = trimEmptyHash($location.absUrl());
|
14164
|
+
var oldState = $browser.state();
|
14165
|
+
var currentReplace = $location.$$replace;
|
14166
|
+
var urlOrStateChanged = oldUrl !== newUrl ||
|
14167
|
+
($location.$$html5 && $sniffer.history && oldState !== $location.$$state);
|
14138
14168
|
|
14139
|
-
|
14140
|
-
|
14141
|
-
var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
|
14142
|
-
$location.$$state, oldState).defaultPrevented;
|
14169
|
+
if (initializing || urlOrStateChanged) {
|
14170
|
+
initializing = false;
|
14143
14171
|
|
14144
|
-
|
14145
|
-
|
14146
|
-
|
14172
|
+
$rootScope.$evalAsync(function() {
|
14173
|
+
var newUrl = $location.absUrl();
|
14174
|
+
var defaultPrevented = $rootScope.$broadcast('$locationChangeStart', newUrl, oldUrl,
|
14175
|
+
$location.$$state, oldState).defaultPrevented;
|
14147
14176
|
|
14148
|
-
|
14149
|
-
|
14150
|
-
$location
|
14151
|
-
|
14152
|
-
if (
|
14153
|
-
|
14154
|
-
|
14177
|
+
// if the location was changed by a `$locationChangeStart` handler then stop
|
14178
|
+
// processing this location change
|
14179
|
+
if ($location.absUrl() !== newUrl) return;
|
14180
|
+
|
14181
|
+
if (defaultPrevented) {
|
14182
|
+
$location.$$parse(oldUrl);
|
14183
|
+
$location.$$state = oldState;
|
14184
|
+
} else {
|
14185
|
+
if (urlOrStateChanged) {
|
14186
|
+
setBrowserUrlWithFallback(newUrl, currentReplace,
|
14187
|
+
oldState === $location.$$state ? null : $location.$$state);
|
14188
|
+
}
|
14189
|
+
afterLocationChange(oldUrl, oldState);
|
14155
14190
|
}
|
14156
|
-
|
14157
|
-
|
14158
|
-
});
|
14191
|
+
});
|
14192
|
+
}
|
14159
14193
|
}
|
14160
14194
|
|
14161
14195
|
$location.$$replace = false;
|
@@ -14233,7 +14267,7 @@ function $LogProvider() {
|
|
14233
14267
|
this.debugEnabled = function(flag) {
|
14234
14268
|
if (isDefined(flag)) {
|
14235
14269
|
debug = flag;
|
14236
|
-
|
14270
|
+
return this;
|
14237
14271
|
} else {
|
14238
14272
|
return debug;
|
14239
14273
|
}
|
@@ -15055,6 +15089,13 @@ function findConstantAndWatchExpressions(ast, $filter) {
|
|
15055
15089
|
if (!property.value.constant) {
|
15056
15090
|
argsToWatch.push.apply(argsToWatch, property.value.toWatch);
|
15057
15091
|
}
|
15092
|
+
if (property.computed) {
|
15093
|
+
findConstantAndWatchExpressions(property.key, $filter);
|
15094
|
+
if (!property.key.constant) {
|
15095
|
+
argsToWatch.push.apply(argsToWatch, property.key.toWatch);
|
15096
|
+
}
|
15097
|
+
}
|
15098
|
+
|
15058
15099
|
});
|
15059
15100
|
ast.constant = allConstants;
|
15060
15101
|
ast.toWatch = argsToWatch;
|
@@ -16120,13 +16161,13 @@ function $ParseProvider() {
|
|
16120
16161
|
}
|
16121
16162
|
}
|
16122
16163
|
|
16123
|
-
function expressionInputDirtyCheck(newValue, oldValueOfValue) {
|
16164
|
+
function expressionInputDirtyCheck(newValue, oldValueOfValue, compareObjectIdentity) {
|
16124
16165
|
|
16125
16166
|
if (newValue == null || oldValueOfValue == null) { // null/undefined
|
16126
16167
|
return newValue === oldValueOfValue;
|
16127
16168
|
}
|
16128
16169
|
|
16129
|
-
if (typeof newValue === 'object') {
|
16170
|
+
if (typeof newValue === 'object' && !compareObjectIdentity) {
|
16130
16171
|
|
16131
16172
|
// attempt to convert the value to a primitive type
|
16132
16173
|
// TODO(docs): add a note to docs that by implementing valueOf even objects and arrays can
|
@@ -16155,7 +16196,7 @@ function $ParseProvider() {
|
|
16155
16196
|
inputExpressions = inputExpressions[0];
|
16156
16197
|
return scope.$watch(function expressionInputWatch(scope) {
|
16157
16198
|
var newInputValue = inputExpressions(scope);
|
16158
|
-
if (!expressionInputDirtyCheck(newInputValue, oldInputValueOf)) {
|
16199
|
+
if (!expressionInputDirtyCheck(newInputValue, oldInputValueOf, parsedExpression.literal)) {
|
16159
16200
|
lastResult = parsedExpression(scope, undefined, undefined, [newInputValue]);
|
16160
16201
|
oldInputValueOf = newInputValue && getValueOf(newInputValue);
|
16161
16202
|
}
|
@@ -16175,7 +16216,7 @@ function $ParseProvider() {
|
|
16175
16216
|
|
16176
16217
|
for (var i = 0, ii = inputExpressions.length; i < ii; i++) {
|
16177
16218
|
var newInputValue = inputExpressions[i](scope);
|
16178
|
-
if (changed || (changed = !expressionInputDirtyCheck(newInputValue, oldInputValueOfValues[i]))) {
|
16219
|
+
if (changed || (changed = !expressionInputDirtyCheck(newInputValue, oldInputValueOfValues[i], parsedExpression.literal))) {
|
16179
16220
|
oldInputValues[i] = newInputValue;
|
16180
16221
|
oldInputValueOfValues[i] = newInputValue && getValueOf(newInputValue);
|
16181
16222
|
}
|
@@ -17868,6 +17909,10 @@ function $RootScopeProvider() {
|
|
17868
17909
|
}
|
17869
17910
|
}
|
17870
17911
|
postDigestQueue.length = postDigestQueuePosition = 0;
|
17912
|
+
|
17913
|
+
// Check for changes to browser url that happened during the $digest
|
17914
|
+
// (for which no event is fired; e.g. via `history.pushState()`)
|
17915
|
+
$browser.$$checkUrlChange();
|
17871
17916
|
},
|
17872
17917
|
|
17873
17918
|
|
@@ -19573,7 +19618,10 @@ function $SnifferProvider() {
|
|
19573
19618
|
// (see https://developer.chrome.com/apps/api_index). If sandboxed, they can be detected by
|
19574
19619
|
// the presence of an extension runtime ID and the absence of other Chrome runtime APIs
|
19575
19620
|
// (see https://developer.chrome.com/apps/manifest/sandbox).
|
19621
|
+
// (NW.js apps have access to Chrome APIs, but do support `history`.)
|
19622
|
+
isNw = $window.nw && $window.nw.process,
|
19576
19623
|
isChromePackagedApp =
|
19624
|
+
!isNw &&
|
19577
19625
|
$window.chrome &&
|
19578
19626
|
($window.chrome.app && $window.chrome.app.runtime ||
|
19579
19627
|
!$window.chrome.app && $window.chrome.runtime && $window.chrome.runtime.id),
|
@@ -22334,7 +22382,8 @@ var htmlAnchorDirective = valueFn({
|
|
22334
22382
|
*
|
22335
22383
|
* @description
|
22336
22384
|
*
|
22337
|
-
* This directive sets the `disabled` attribute on the element
|
22385
|
+
* This directive sets the `disabled` attribute on the element (typically a form control,
|
22386
|
+
* e.g. `input`, `button`, `select` etc.) if the
|
22338
22387
|
* {@link guide/expression expression} inside `ngDisabled` evaluates to truthy.
|
22339
22388
|
*
|
22340
22389
|
* A special directive is necessary because we cannot use interpolation inside the `disabled`
|
@@ -24840,15 +24889,27 @@ function isValidForStep(viewValue, stepBase, step) {
|
|
24840
24889
|
// and `viewValue` is expected to be a valid stringified number.
|
24841
24890
|
var value = Number(viewValue);
|
24842
24891
|
|
24892
|
+
var isNonIntegerValue = !isNumberInteger(value);
|
24893
|
+
var isNonIntegerStepBase = !isNumberInteger(stepBase);
|
24894
|
+
var isNonIntegerStep = !isNumberInteger(step);
|
24895
|
+
|
24843
24896
|
// Due to limitations in Floating Point Arithmetic (e.g. `0.3 - 0.2 !== 0.1` or
|
24844
24897
|
// `0.5 % 0.1 !== 0`), we need to convert all numbers to integers.
|
24845
|
-
if (
|
24846
|
-
var
|
24898
|
+
if (isNonIntegerValue || isNonIntegerStepBase || isNonIntegerStep) {
|
24899
|
+
var valueDecimals = isNonIntegerValue ? countDecimals(value) : 0;
|
24900
|
+
var stepBaseDecimals = isNonIntegerStepBase ? countDecimals(stepBase) : 0;
|
24901
|
+
var stepDecimals = isNonIntegerStep ? countDecimals(step) : 0;
|
24902
|
+
|
24903
|
+
var decimalCount = Math.max(valueDecimals, stepBaseDecimals, stepDecimals);
|
24847
24904
|
var multiplier = Math.pow(10, decimalCount);
|
24848
24905
|
|
24849
24906
|
value = value * multiplier;
|
24850
24907
|
stepBase = stepBase * multiplier;
|
24851
24908
|
step = step * multiplier;
|
24909
|
+
|
24910
|
+
if (isNonIntegerValue) value = Math.round(value);
|
24911
|
+
if (isNonIntegerStepBase) stepBase = Math.round(stepBase);
|
24912
|
+
if (isNonIntegerStep) step = Math.round(step);
|
24852
24913
|
}
|
24853
24914
|
|
24854
24915
|
return (value - stepBase) % step === 0;
|
@@ -25405,7 +25466,10 @@ var ngValueDirective = function() {
|
|
25405
25466
|
* makes it possible to use ngValue as a sort of one-way bind.
|
25406
25467
|
*/
|
25407
25468
|
function updateElementValue(element, attr, value) {
|
25408
|
-
|
25469
|
+
// Support: IE9 only
|
25470
|
+
// In IE9 values are converted to string (e.g. `input.value = null` results in `input.value === 'null'`).
|
25471
|
+
var propValue = isDefined(value) ? value : (msie === 9) ? '' : null;
|
25472
|
+
element.prop('value', propValue);
|
25409
25473
|
attr.$set('value', value);
|
25410
25474
|
}
|
25411
25475
|
|
@@ -26733,15 +26797,15 @@ forEach(
|
|
26733
26797
|
return {
|
26734
26798
|
restrict: 'A',
|
26735
26799
|
compile: function($element, attr) {
|
26736
|
-
//
|
26737
|
-
//
|
26738
|
-
//
|
26739
|
-
//
|
26740
|
-
var fn = $parse(attr[directiveName]
|
26800
|
+
// NOTE:
|
26801
|
+
// We expose the powerful `$event` object on the scope that provides access to the Window,
|
26802
|
+
// etc. This is OK, because expressions are not sandboxed any more (and the expression
|
26803
|
+
// sandbox was never meant to be a security feature anyway).
|
26804
|
+
var fn = $parse(attr[directiveName]);
|
26741
26805
|
return function ngEventHandler(scope, element) {
|
26742
26806
|
element.on(eventName, function(event) {
|
26743
26807
|
var callback = function() {
|
26744
|
-
fn(scope, {$event:event});
|
26808
|
+
fn(scope, {$event: event});
|
26745
26809
|
};
|
26746
26810
|
if (forceAsyncEvents[eventName] && $rootScope.$$phase) {
|
26747
26811
|
scope.$evalAsync(callback);
|
@@ -28620,6 +28684,29 @@ NgModelController.prototype = {
|
|
28620
28684
|
that.$commitViewValue();
|
28621
28685
|
});
|
28622
28686
|
}
|
28687
|
+
},
|
28688
|
+
|
28689
|
+
/**
|
28690
|
+
* @ngdoc method
|
28691
|
+
*
|
28692
|
+
* @name ngModel.NgModelController#$overrideModelOptions
|
28693
|
+
*
|
28694
|
+
* @description
|
28695
|
+
*
|
28696
|
+
* Override the current model options settings programmatically.
|
28697
|
+
*
|
28698
|
+
* The previous `ModelOptions` value will not be modified. Instead, a
|
28699
|
+
* new `ModelOptions` object will inherit from the previous one overriding
|
28700
|
+
* or inheriting settings that are defined in the given parameter.
|
28701
|
+
*
|
28702
|
+
* See {@link ngModelOptions} for information about what options can be specified
|
28703
|
+
* and how model option inheritance works.
|
28704
|
+
*
|
28705
|
+
* @param {Object} options a hash of settings to override the previous options
|
28706
|
+
*
|
28707
|
+
*/
|
28708
|
+
$overrideModelOptions: function(options) {
|
28709
|
+
this.$options = this.$options.createChild(options);
|
28623
28710
|
}
|
28624
28711
|
};
|
28625
28712
|
|
@@ -30883,11 +30970,13 @@ var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';
|
|
30883
30970
|
* @multiElement
|
30884
30971
|
*
|
30885
30972
|
* @description
|
30886
|
-
* The `ngShow` directive shows or hides the given HTML element based on the expression
|
30887
|
-
*
|
30888
|
-
*
|
30889
|
-
*
|
30890
|
-
*
|
30973
|
+
* The `ngShow` directive shows or hides the given HTML element based on the expression provided to
|
30974
|
+
* the `ngShow` attribute.
|
30975
|
+
*
|
30976
|
+
* The element is shown or hidden by removing or adding the `.ng-hide` CSS class onto the element.
|
30977
|
+
* The `.ng-hide` CSS class is predefined in AngularJS and sets the display style to none (using an
|
30978
|
+
* `!important` flag). For CSP mode please add `angular-csp.css` to your HTML file (see
|
30979
|
+
* {@link ng.directive:ngCsp ngCsp}).
|
30891
30980
|
*
|
30892
30981
|
* ```html
|
30893
30982
|
* <!-- when $scope.myValue is truthy (element is visible) -->
|
@@ -30897,31 +30986,32 @@ var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';
|
|
30897
30986
|
* <div ng-show="myValue" class="ng-hide"></div>
|
30898
30987
|
* ```
|
30899
30988
|
*
|
30900
|
-
* When the `ngShow` expression evaluates to a falsy value then the `.ng-hide` CSS class is added
|
30901
|
-
* attribute on the element causing it to become hidden. When truthy, the `.ng-hide`
|
30902
|
-
* from the element causing the element not to appear hidden.
|
30989
|
+
* When the `ngShow` expression evaluates to a falsy value then the `.ng-hide` CSS class is added
|
30990
|
+
* to the class attribute on the element causing it to become hidden. When truthy, the `.ng-hide`
|
30991
|
+
* CSS class is removed from the element causing the element not to appear hidden.
|
30903
30992
|
*
|
30904
|
-
* ## Why is
|
30993
|
+
* ## Why is `!important` used?
|
30905
30994
|
*
|
30906
|
-
* You may be wondering why
|
30907
|
-
* can be easily overridden by heavier selectors. For example, something as
|
30908
|
-
* as changing the display style on a HTML list item would make hidden elements appear
|
30909
|
-
* This also becomes a bigger issue when dealing with CSS frameworks.
|
30995
|
+
* You may be wondering why `!important` is used for the `.ng-hide` CSS class. This is because the
|
30996
|
+
* `.ng-hide` selector can be easily overridden by heavier selectors. For example, something as
|
30997
|
+
* simple as changing the display style on a HTML list item would make hidden elements appear
|
30998
|
+
* visible. This also becomes a bigger issue when dealing with CSS frameworks.
|
30910
30999
|
*
|
30911
|
-
* By using
|
30912
|
-
* specificity (when
|
30913
|
-
* styling to change how to hide an element then it is just a
|
31000
|
+
* By using `!important`, the show and hide behavior will work as expected despite any clash between
|
31001
|
+
* CSS selector specificity (when `!important` isn't used with any conflicting styles). If a
|
31002
|
+
* developer chooses to override the styling to change how to hide an element then it is just a
|
31003
|
+
* matter of using `!important` in their own CSS code.
|
30914
31004
|
*
|
30915
31005
|
* ### Overriding `.ng-hide`
|
30916
31006
|
*
|
30917
|
-
* By default, the `.ng-hide` class will style the element with `display: none!important`. If you
|
30918
|
-
* the hide behavior with ngShow
|
30919
|
-
*
|
30920
|
-
* with extra animation classes that can be added.
|
31007
|
+
* By default, the `.ng-hide` class will style the element with `display: none !important`. If you
|
31008
|
+
* wish to change the hide behavior with `ngShow`/`ngHide`, you can simply overwrite the styles for
|
31009
|
+
* the `.ng-hide` CSS class. Note that the selector that needs to be used is actually
|
31010
|
+
* `.ng-hide:not(.ng-hide-animate)` to cope with extra animation classes that can be added.
|
30921
31011
|
*
|
30922
31012
|
* ```css
|
30923
31013
|
* .ng-hide:not(.ng-hide-animate) {
|
30924
|
-
* /*
|
31014
|
+
* /* These are just alternative ways of hiding an element */
|
30925
31015
|
* display: block!important;
|
30926
31016
|
* position: absolute;
|
30927
31017
|
* top: -9999px;
|
@@ -30929,29 +31019,20 @@ var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';
|
|
30929
31019
|
* }
|
30930
31020
|
* ```
|
30931
31021
|
*
|
30932
|
-
* By default you don't need to override in CSS
|
31022
|
+
* By default you don't need to override anything in CSS and the animations will work around the
|
31023
|
+
* display style.
|
30933
31024
|
*
|
30934
31025
|
* ## A note about animations with `ngShow`
|
30935
31026
|
*
|
30936
|
-
* Animations in ngShow
|
30937
|
-
* is true and false. This system works like the animation system present with
|
30938
|
-
* you must also include the
|
30939
|
-
* so that
|
31027
|
+
* Animations in `ngShow`/`ngHide` work with the show and hide events that are triggered when the
|
31028
|
+
* directive expression is true and false. This system works like the animation system present with
|
31029
|
+
* `ngClass` except that you must also include the `!important` flag to override the display
|
31030
|
+
* property so that the elements are not actually hidden during the animation.
|
30940
31031
|
*
|
30941
31032
|
* ```css
|
30942
|
-
*
|
30943
|
-
* //a working example can be found at the bottom of this page
|
30944
|
-
* //
|
31033
|
+
* /* A working example can be found at the bottom of this page. */
|
30945
31034
|
* .my-element.ng-hide-add, .my-element.ng-hide-remove {
|
30946
|
-
*
|
30947
|
-
* apply all styling in a show/hide animation */
|
30948
|
-
* transition: 0s linear all;
|
30949
|
-
* }
|
30950
|
-
*
|
30951
|
-
* .my-element.ng-hide-add-active,
|
30952
|
-
* .my-element.ng-hide-remove-active {
|
30953
|
-
* /* the transition is defined in the active class */
|
30954
|
-
* transition: 1s linear all;
|
31035
|
+
* transition: all 0.5s linear;
|
30955
31036
|
* }
|
30956
31037
|
*
|
30957
31038
|
* .my-element.ng-hide-add { ... }
|
@@ -30960,76 +31041,108 @@ var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';
|
|
30960
31041
|
* .my-element.ng-hide-remove.ng-hide-remove-active { ... }
|
30961
31042
|
* ```
|
30962
31043
|
*
|
30963
|
-
* Keep in mind that, as of AngularJS version 1.3, there is no need to change the display
|
30964
|
-
*
|
31044
|
+
* Keep in mind that, as of AngularJS version 1.3, there is no need to change the display property
|
31045
|
+
* to block during animation states - ngAnimate will automatically handle the style toggling for you.
|
30965
31046
|
*
|
30966
31047
|
* @animations
|
30967
|
-
* | Animation
|
30968
|
-
*
|
30969
|
-
* | {@link $animate#addClass addClass} `.ng-hide`
|
30970
|
-
* | {@link $animate#removeClass removeClass}
|
31048
|
+
* | Animation | Occurs |
|
31049
|
+
* |-----------------------------------------------------|---------------------------------------------------------------------------------------------------------------|
|
31050
|
+
* | {@link $animate#addClass addClass} `.ng-hide` | After the `ngShow` expression evaluates to a non truthy value and just before the contents are set to hidden. |
|
31051
|
+
* | {@link $animate#removeClass removeClass} `.ng-hide` | After the `ngShow` expression evaluates to a truthy value and just before contents are set to visible. |
|
30971
31052
|
*
|
30972
31053
|
* @element ANY
|
30973
|
-
* @param {expression} ngShow If the {@link guide/expression expression} is truthy
|
30974
|
-
*
|
31054
|
+
* @param {expression} ngShow If the {@link guide/expression expression} is truthy/falsy then the
|
31055
|
+
* element is shown/hidden respectively.
|
30975
31056
|
*
|
30976
31057
|
* @example
|
30977
|
-
|
31058
|
+
* A simple example, animating the element's opacity:
|
31059
|
+
*
|
31060
|
+
<example module="ngAnimate" deps="angular-animate.js" animations="true" name="ng-show-simple">
|
30978
31061
|
<file name="index.html">
|
30979
|
-
|
30980
|
-
<div>
|
30981
|
-
|
30982
|
-
<div class="check-element animate-show" ng-show="checked">
|
30983
|
-
<span class="glyphicon glyphicon-thumbs-up"></span> I show up when your checkbox is checked.
|
30984
|
-
</div>
|
30985
|
-
</div>
|
30986
|
-
<div>
|
30987
|
-
Hide:
|
30988
|
-
<div class="check-element animate-show" ng-hide="checked">
|
30989
|
-
<span class="glyphicon glyphicon-thumbs-down"></span> I hide when your checkbox is checked.
|
30990
|
-
</div>
|
31062
|
+
Show: <input type="checkbox" ng-model="checked" aria-label="Toggle ngShow"><br />
|
31063
|
+
<div class="check-element animate-show-hide" ng-show="checked">
|
31064
|
+
I show up when your checkbox is checked.
|
30991
31065
|
</div>
|
30992
31066
|
</file>
|
30993
|
-
<file name="glyphicons.css">
|
30994
|
-
@import url(../../components/bootstrap-3.1.1/css/bootstrap.css);
|
30995
|
-
</file>
|
30996
31067
|
<file name="animations.css">
|
30997
|
-
.animate-show {
|
30998
|
-
|
31068
|
+
.animate-show-hide.ng-hide {
|
31069
|
+
opacity: 0;
|
31070
|
+
}
|
31071
|
+
|
31072
|
+
.animate-show-hide.ng-hide-add,
|
31073
|
+
.animate-show-hide.ng-hide-remove {
|
31074
|
+
transition: all linear 0.5s;
|
31075
|
+
}
|
31076
|
+
|
31077
|
+
.check-element {
|
31078
|
+
border: 1px solid black;
|
30999
31079
|
opacity: 1;
|
31000
31080
|
padding: 10px;
|
31001
|
-
border: 1px solid black;
|
31002
|
-
background: white;
|
31003
31081
|
}
|
31082
|
+
</file>
|
31083
|
+
<file name="protractor.js" type="protractor">
|
31084
|
+
it('should check ngShow', function() {
|
31085
|
+
var checkbox = element(by.model('checked'));
|
31086
|
+
var checkElem = element(by.css('.check-element'));
|
31004
31087
|
|
31005
|
-
|
31006
|
-
|
31088
|
+
expect(checkElem.isDisplayed()).toBe(false);
|
31089
|
+
checkbox.click();
|
31090
|
+
expect(checkElem.isDisplayed()).toBe(true);
|
31091
|
+
});
|
31092
|
+
</file>
|
31093
|
+
</example>
|
31094
|
+
*
|
31095
|
+
* <hr />
|
31096
|
+
* @example
|
31097
|
+
* A more complex example, featuring different show/hide animations:
|
31098
|
+
*
|
31099
|
+
<example module="ngAnimate" deps="angular-animate.js" animations="true" name="ng-show-complex">
|
31100
|
+
<file name="index.html">
|
31101
|
+
Show: <input type="checkbox" ng-model="checked" aria-label="Toggle ngShow"><br />
|
31102
|
+
<div class="check-element funky-show-hide" ng-show="checked">
|
31103
|
+
I show up when your checkbox is checked.
|
31104
|
+
</div>
|
31105
|
+
</file>
|
31106
|
+
<file name="animations.css">
|
31107
|
+
body {
|
31108
|
+
overflow: hidden;
|
31109
|
+
perspective: 1000px;
|
31007
31110
|
}
|
31008
31111
|
|
31009
|
-
.
|
31010
|
-
|
31011
|
-
|
31012
|
-
|
31112
|
+
.funky-show-hide.ng-hide-add {
|
31113
|
+
transform: rotateZ(0);
|
31114
|
+
transform-origin: right;
|
31115
|
+
transition: all 0.5s ease-in-out;
|
31116
|
+
}
|
31117
|
+
|
31118
|
+
.funky-show-hide.ng-hide-add.ng-hide-add-active {
|
31119
|
+
transform: rotateZ(-135deg);
|
31120
|
+
}
|
31121
|
+
|
31122
|
+
.funky-show-hide.ng-hide-remove {
|
31123
|
+
transform: rotateY(90deg);
|
31124
|
+
transform-origin: left;
|
31125
|
+
transition: all 0.5s ease;
|
31126
|
+
}
|
31127
|
+
|
31128
|
+
.funky-show-hide.ng-hide-remove.ng-hide-remove-active {
|
31129
|
+
transform: rotateY(0);
|
31013
31130
|
}
|
31014
31131
|
|
31015
31132
|
.check-element {
|
31016
|
-
padding: 10px;
|
31017
31133
|
border: 1px solid black;
|
31018
|
-
|
31134
|
+
opacity: 1;
|
31135
|
+
padding: 10px;
|
31019
31136
|
}
|
31020
31137
|
</file>
|
31021
31138
|
<file name="protractor.js" type="protractor">
|
31022
|
-
|
31023
|
-
|
31139
|
+
it('should check ngShow', function() {
|
31140
|
+
var checkbox = element(by.model('checked'));
|
31141
|
+
var checkElem = element(by.css('.check-element'));
|
31024
31142
|
|
31025
|
-
|
31026
|
-
|
31027
|
-
expect(
|
31028
|
-
|
31029
|
-
element(by.model('checked')).click();
|
31030
|
-
|
31031
|
-
expect(thumbsUp.isDisplayed()).toBeTruthy();
|
31032
|
-
expect(thumbsDown.isDisplayed()).toBeFalsy();
|
31143
|
+
expect(checkElem.isDisplayed()).toBe(false);
|
31144
|
+
checkbox.click();
|
31145
|
+
expect(checkElem.isDisplayed()).toBe(true);
|
31033
31146
|
});
|
31034
31147
|
</file>
|
31035
31148
|
</example>
|
@@ -31059,11 +31172,13 @@ var ngShowDirective = ['$animate', function($animate) {
|
|
31059
31172
|
* @multiElement
|
31060
31173
|
*
|
31061
31174
|
* @description
|
31062
|
-
* The `ngHide` directive shows or hides the given HTML element based on the expression
|
31063
|
-
*
|
31064
|
-
*
|
31065
|
-
*
|
31066
|
-
*
|
31175
|
+
* The `ngHide` directive shows or hides the given HTML element based on the expression provided to
|
31176
|
+
* the `ngHide` attribute.
|
31177
|
+
*
|
31178
|
+
* The element is shown or hidden by removing or adding the `.ng-hide` CSS class onto the element.
|
31179
|
+
* The `.ng-hide` CSS class is predefined in AngularJS and sets the display style to none (using an
|
31180
|
+
* `!important` flag). For CSP mode please add `angular-csp.css` to your HTML file (see
|
31181
|
+
* {@link ng.directive:ngCsp ngCsp}).
|
31067
31182
|
*
|
31068
31183
|
* ```html
|
31069
31184
|
* <!-- when $scope.myValue is truthy (element is hidden) -->
|
@@ -31073,30 +31188,32 @@ var ngShowDirective = ['$animate', function($animate) {
|
|
31073
31188
|
* <div ng-hide="myValue"></div>
|
31074
31189
|
* ```
|
31075
31190
|
*
|
31076
|
-
* When the `ngHide` expression evaluates to a truthy value then the `.ng-hide` CSS class is added
|
31077
|
-
* attribute on the element causing it to become hidden. When falsy, the `.ng-hide`
|
31078
|
-
* from the element causing the element not to appear hidden.
|
31191
|
+
* When the `ngHide` expression evaluates to a truthy value then the `.ng-hide` CSS class is added
|
31192
|
+
* to the class attribute on the element causing it to become hidden. When falsy, the `.ng-hide`
|
31193
|
+
* CSS class is removed from the element causing the element not to appear hidden.
|
31079
31194
|
*
|
31080
|
-
* ## Why is
|
31195
|
+
* ## Why is `!important` used?
|
31081
31196
|
*
|
31082
|
-
* You may be wondering why
|
31083
|
-
* can be easily overridden by heavier selectors. For example, something as
|
31084
|
-
* as changing the display style on a HTML list item would make hidden elements appear
|
31085
|
-
* This also becomes a bigger issue when dealing with CSS frameworks.
|
31197
|
+
* You may be wondering why `!important` is used for the `.ng-hide` CSS class. This is because the
|
31198
|
+
* `.ng-hide` selector can be easily overridden by heavier selectors. For example, something as
|
31199
|
+
* simple as changing the display style on a HTML list item would make hidden elements appear
|
31200
|
+
* visible. This also becomes a bigger issue when dealing with CSS frameworks.
|
31086
31201
|
*
|
31087
|
-
* By using
|
31088
|
-
* specificity (when
|
31089
|
-
* styling to change how to hide an element then it is just a
|
31202
|
+
* By using `!important`, the show and hide behavior will work as expected despite any clash between
|
31203
|
+
* CSS selector specificity (when `!important` isn't used with any conflicting styles). If a
|
31204
|
+
* developer chooses to override the styling to change how to hide an element then it is just a
|
31205
|
+
* matter of using `!important` in their own CSS code.
|
31090
31206
|
*
|
31091
31207
|
* ### Overriding `.ng-hide`
|
31092
31208
|
*
|
31093
|
-
* By default, the `.ng-hide` class will style the element with `display: none!important`. If you
|
31094
|
-
* the hide behavior with ngShow
|
31095
|
-
* class
|
31209
|
+
* By default, the `.ng-hide` class will style the element with `display: none !important`. If you
|
31210
|
+
* wish to change the hide behavior with `ngShow`/`ngHide`, you can simply overwrite the styles for
|
31211
|
+
* the `.ng-hide` CSS class. Note that the selector that needs to be used is actually
|
31212
|
+
* `.ng-hide:not(.ng-hide-animate)` to cope with extra animation classes that can be added.
|
31096
31213
|
*
|
31097
31214
|
* ```css
|
31098
|
-
* .ng-hide {
|
31099
|
-
* /*
|
31215
|
+
* .ng-hide:not(.ng-hide-animate) {
|
31216
|
+
* /* These are just alternative ways of hiding an element */
|
31100
31217
|
* display: block!important;
|
31101
31218
|
* position: absolute;
|
31102
31219
|
* top: -9999px;
|
@@ -31104,20 +31221,20 @@ var ngShowDirective = ['$animate', function($animate) {
|
|
31104
31221
|
* }
|
31105
31222
|
* ```
|
31106
31223
|
*
|
31107
|
-
* By default you don't need to override in CSS anything and the animations will work around the
|
31224
|
+
* By default you don't need to override in CSS anything and the animations will work around the
|
31225
|
+
* display style.
|
31108
31226
|
*
|
31109
31227
|
* ## A note about animations with `ngHide`
|
31110
31228
|
*
|
31111
|
-
* Animations in ngShow
|
31112
|
-
* is true and false. This system works like the animation system present with
|
31113
|
-
*
|
31229
|
+
* Animations in `ngShow`/`ngHide` work with the show and hide events that are triggered when the
|
31230
|
+
* directive expression is true and false. This system works like the animation system present with
|
31231
|
+
* `ngClass` except that you must also include the `!important` flag to override the display
|
31232
|
+
* property so that the elements are not actually hidden during the animation.
|
31114
31233
|
*
|
31115
31234
|
* ```css
|
31116
|
-
*
|
31117
|
-
* //a working example can be found at the bottom of this page
|
31118
|
-
* //
|
31235
|
+
* /* A working example can be found at the bottom of this page. */
|
31119
31236
|
* .my-element.ng-hide-add, .my-element.ng-hide-remove {
|
31120
|
-
* transition: 0.5s linear
|
31237
|
+
* transition: all 0.5s linear;
|
31121
31238
|
* }
|
31122
31239
|
*
|
31123
31240
|
* .my-element.ng-hide-add { ... }
|
@@ -31126,74 +31243,109 @@ var ngShowDirective = ['$animate', function($animate) {
|
|
31126
31243
|
* .my-element.ng-hide-remove.ng-hide-remove-active { ... }
|
31127
31244
|
* ```
|
31128
31245
|
*
|
31129
|
-
* Keep in mind that, as of AngularJS version 1.3, there is no need to change the display
|
31130
|
-
*
|
31246
|
+
* Keep in mind that, as of AngularJS version 1.3, there is no need to change the display property
|
31247
|
+
* to block during animation states - ngAnimate will automatically handle the style toggling for you.
|
31131
31248
|
*
|
31132
31249
|
* @animations
|
31133
|
-
* | Animation
|
31134
|
-
*
|
31135
|
-
* | {@link $animate#addClass addClass} `.ng-hide`
|
31136
|
-
* | {@link $animate#removeClass removeClass}
|
31250
|
+
* | Animation | Occurs |
|
31251
|
+
* |-----------------------------------------------------|------------------------------------------------------------------------------------------------------------|
|
31252
|
+
* | {@link $animate#addClass addClass} `.ng-hide` | After the `ngHide` expression evaluates to a truthy value and just before the contents are set to hidden. |
|
31253
|
+
* | {@link $animate#removeClass removeClass} `.ng-hide` | After the `ngHide` expression evaluates to a non truthy value and just before contents are set to visible. |
|
31137
31254
|
*
|
31138
31255
|
*
|
31139
31256
|
* @element ANY
|
31140
|
-
* @param {expression} ngHide If the {@link guide/expression expression} is truthy then
|
31141
|
-
*
|
31257
|
+
* @param {expression} ngHide If the {@link guide/expression expression} is truthy/falsy then the
|
31258
|
+
* element is hidden/shown respectively.
|
31142
31259
|
*
|
31143
31260
|
* @example
|
31144
|
-
|
31261
|
+
* A simple example, animating the element's opacity:
|
31262
|
+
*
|
31263
|
+
<example module="ngAnimate" deps="angular-animate.js" animations="true" name="ng-hide-simple">
|
31145
31264
|
<file name="index.html">
|
31146
|
-
|
31147
|
-
<div>
|
31148
|
-
|
31149
|
-
<div class="check-element animate-hide" ng-show="checked">
|
31150
|
-
<span class="glyphicon glyphicon-thumbs-up"></span> I show up when your checkbox is checked.
|
31151
|
-
</div>
|
31265
|
+
Hide: <input type="checkbox" ng-model="checked" aria-label="Toggle ngHide"><br />
|
31266
|
+
<div class="check-element animate-show-hide" ng-hide="checked">
|
31267
|
+
I hide when your checkbox is checked.
|
31152
31268
|
</div>
|
31153
|
-
<div>
|
31154
|
-
Hide:
|
31155
|
-
<div class="check-element animate-hide" ng-hide="checked">
|
31156
|
-
<span class="glyphicon glyphicon-thumbs-down"></span> I hide when your checkbox is checked.
|
31157
|
-
</div>
|
31158
|
-
</div>
|
31159
|
-
</file>
|
31160
|
-
<file name="glyphicons.css">
|
31161
|
-
@import url(../../components/bootstrap-3.1.1/css/bootstrap.css);
|
31162
31269
|
</file>
|
31163
31270
|
<file name="animations.css">
|
31164
|
-
.animate-hide {
|
31271
|
+
.animate-show-hide.ng-hide {
|
31272
|
+
opacity: 0;
|
31273
|
+
}
|
31274
|
+
|
31275
|
+
.animate-show-hide.ng-hide-add,
|
31276
|
+
.animate-show-hide.ng-hide-remove {
|
31165
31277
|
transition: all linear 0.5s;
|
31166
|
-
|
31278
|
+
}
|
31279
|
+
|
31280
|
+
.check-element {
|
31281
|
+
border: 1px solid black;
|
31167
31282
|
opacity: 1;
|
31168
31283
|
padding: 10px;
|
31169
|
-
border: 1px solid black;
|
31170
|
-
background: white;
|
31171
31284
|
}
|
31285
|
+
</file>
|
31286
|
+
<file name="protractor.js" type="protractor">
|
31287
|
+
it('should check ngHide', function() {
|
31288
|
+
var checkbox = element(by.model('checked'));
|
31289
|
+
var checkElem = element(by.css('.check-element'));
|
31172
31290
|
|
31173
|
-
|
31174
|
-
|
31175
|
-
|
31176
|
-
|
31291
|
+
expect(checkElem.isDisplayed()).toBe(true);
|
31292
|
+
checkbox.click();
|
31293
|
+
expect(checkElem.isDisplayed()).toBe(false);
|
31294
|
+
});
|
31295
|
+
</file>
|
31296
|
+
</example>
|
31297
|
+
*
|
31298
|
+
* <hr />
|
31299
|
+
* @example
|
31300
|
+
* A more complex example, featuring different show/hide animations:
|
31301
|
+
*
|
31302
|
+
<example module="ngAnimate" deps="angular-animate.js" animations="true" name="ng-hide-complex">
|
31303
|
+
<file name="index.html">
|
31304
|
+
Hide: <input type="checkbox" ng-model="checked" aria-label="Toggle ngHide"><br />
|
31305
|
+
<div class="check-element funky-show-hide" ng-hide="checked">
|
31306
|
+
I hide when your checkbox is checked.
|
31307
|
+
</div>
|
31308
|
+
</file>
|
31309
|
+
<file name="animations.css">
|
31310
|
+
body {
|
31311
|
+
overflow: hidden;
|
31312
|
+
perspective: 1000px;
|
31313
|
+
}
|
31314
|
+
|
31315
|
+
.funky-show-hide.ng-hide-add {
|
31316
|
+
transform: rotateZ(0);
|
31317
|
+
transform-origin: right;
|
31318
|
+
transition: all 0.5s ease-in-out;
|
31319
|
+
}
|
31320
|
+
|
31321
|
+
.funky-show-hide.ng-hide-add.ng-hide-add-active {
|
31322
|
+
transform: rotateZ(-135deg);
|
31323
|
+
}
|
31324
|
+
|
31325
|
+
.funky-show-hide.ng-hide-remove {
|
31326
|
+
transform: rotateY(90deg);
|
31327
|
+
transform-origin: left;
|
31328
|
+
transition: all 0.5s ease;
|
31329
|
+
}
|
31330
|
+
|
31331
|
+
.funky-show-hide.ng-hide-remove.ng-hide-remove-active {
|
31332
|
+
transform: rotateY(0);
|
31177
31333
|
}
|
31178
31334
|
|
31179
31335
|
.check-element {
|
31180
|
-
padding: 10px;
|
31181
31336
|
border: 1px solid black;
|
31182
|
-
|
31337
|
+
opacity: 1;
|
31338
|
+
padding: 10px;
|
31183
31339
|
}
|
31184
31340
|
</file>
|
31185
31341
|
<file name="protractor.js" type="protractor">
|
31186
|
-
|
31187
|
-
|
31188
|
-
|
31189
|
-
it('should check ng-show / ng-hide', function() {
|
31190
|
-
expect(thumbsUp.isDisplayed()).toBeFalsy();
|
31191
|
-
expect(thumbsDown.isDisplayed()).toBeTruthy();
|
31342
|
+
it('should check ngHide', function() {
|
31343
|
+
var checkbox = element(by.model('checked'));
|
31344
|
+
var checkElem = element(by.css('.check-element'));
|
31192
31345
|
|
31193
|
-
|
31194
|
-
|
31195
|
-
expect(
|
31196
|
-
expect(thumbsDown.isDisplayed()).toBeFalsy();
|
31346
|
+
expect(checkElem.isDisplayed()).toBe(true);
|
31347
|
+
checkbox.click();
|
31348
|
+
expect(checkElem.isDisplayed()).toBe(false);
|
31197
31349
|
});
|
31198
31350
|
</file>
|
31199
31351
|
</example>
|
@@ -31788,7 +31940,7 @@ var SelectController =
|
|
31788
31940
|
['$element', '$scope', /** @this */ function($element, $scope) {
|
31789
31941
|
|
31790
31942
|
var self = this,
|
31791
|
-
optionsMap = new
|
31943
|
+
optionsMap = new NgMap();
|
31792
31944
|
|
31793
31945
|
self.selectValueMap = {}; // Keys are the hashed values, values the original values
|
31794
31946
|
|
@@ -31909,7 +32061,7 @@ var SelectController =
|
|
31909
32061
|
self.emptyOption = element;
|
31910
32062
|
}
|
31911
32063
|
var count = optionsMap.get(value) || 0;
|
31912
|
-
optionsMap.
|
32064
|
+
optionsMap.set(value, count + 1);
|
31913
32065
|
// Only render at the end of a digest. This improves render performance when many options
|
31914
32066
|
// are added during a digest and ensures all relevant options are correctly marked as selected
|
31915
32067
|
scheduleRender();
|
@@ -31920,13 +32072,13 @@ var SelectController =
|
|
31920
32072
|
var count = optionsMap.get(value);
|
31921
32073
|
if (count) {
|
31922
32074
|
if (count === 1) {
|
31923
|
-
optionsMap.
|
32075
|
+
optionsMap.delete(value);
|
31924
32076
|
if (value === '') {
|
31925
32077
|
self.hasEmptyOption = false;
|
31926
32078
|
self.emptyOption = undefined;
|
31927
32079
|
}
|
31928
32080
|
} else {
|
31929
|
-
optionsMap.
|
32081
|
+
optionsMap.set(value, count - 1);
|
31930
32082
|
}
|
31931
32083
|
}
|
31932
32084
|
};
|
@@ -32053,7 +32205,7 @@ var SelectController =
|
|
32053
32205
|
var removeValue = optionAttrs.value;
|
32054
32206
|
|
32055
32207
|
self.removeOption(removeValue);
|
32056
|
-
|
32208
|
+
scheduleRender();
|
32057
32209
|
|
32058
32210
|
if (self.multiple && currentValue && currentValue.indexOf(removeValue) !== -1 ||
|
32059
32211
|
currentValue === removeValue
|
@@ -32378,9 +32530,9 @@ var selectDirective = function() {
|
|
32378
32530
|
|
32379
32531
|
// Write value now needs to set the selected property of each matching option
|
32380
32532
|
selectCtrl.writeValue = function writeMultipleValue(value) {
|
32381
|
-
var items = new HashMap(value);
|
32382
32533
|
forEach(element.find('option'), function(option) {
|
32383
|
-
option.selected =
|
32534
|
+
option.selected = !!value && (includes(value, option.value) ||
|
32535
|
+
includes(value, selectCtrl.selectValueMap[option.value]));
|
32384
32536
|
});
|
32385
32537
|
};
|
32386
32538
|
|