angularjs-rails 1.3.10 → 1.3.14
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 +2 -3
- data/vendor/assets/javascripts/angular-aria.js +16 -6
- data/vendor/assets/javascripts/angular-cookies.js +1 -1
- data/vendor/assets/javascripts/angular-loader.js +2 -2
- data/vendor/assets/javascripts/angular-messages.js +1 -1
- data/vendor/assets/javascripts/angular-mocks.js +15 -1
- data/vendor/assets/javascripts/angular-resource.js +2 -1
- data/vendor/assets/javascripts/angular-route.js +5 -11
- data/vendor/assets/javascripts/angular-sanitize.js +15 -27
- data/vendor/assets/javascripts/angular-scenario.js +243 -138
- data/vendor/assets/javascripts/angular-touch.js +1 -1
- data/vendor/assets/javascripts/angular.js +209 -119
- data/vendor/assets/javascripts/unstable/angular-animate.js +2 -3
- data/vendor/assets/javascripts/unstable/angular-aria.js +16 -6
- data/vendor/assets/javascripts/unstable/angular-cookies.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-loader.js +2 -2
- data/vendor/assets/javascripts/unstable/angular-messages.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-mocks.js +15 -1
- data/vendor/assets/javascripts/unstable/angular-resource.js +2 -1
- data/vendor/assets/javascripts/unstable/angular-route.js +5 -11
- data/vendor/assets/javascripts/unstable/angular-sanitize.js +15 -27
- data/vendor/assets/javascripts/unstable/angular-scenario.js +243 -138
- data/vendor/assets/javascripts/unstable/angular-touch.js +1 -1
- data/vendor/assets/javascripts/unstable/angular.js +209 -119
- metadata +2 -2
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.14
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -1333,8 +1333,7 @@ angular.module('ngAnimate', ['ng'])
|
|
1333
1333
|
} else if (lastAnimation.event == 'setClass') {
|
1334
1334
|
animationsToCancel.push(lastAnimation);
|
1335
1335
|
cleanup(element, className);
|
1336
|
-
}
|
1337
|
-
else if (runningAnimations[className]) {
|
1336
|
+
} else if (runningAnimations[className]) {
|
1338
1337
|
var current = runningAnimations[className];
|
1339
1338
|
if (current.event == animationEvent) {
|
1340
1339
|
skipAnimation = true;
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.14
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -105,7 +105,8 @@ function $AriaProvider() {
|
|
105
105
|
* - **ariaMultiline** – `{boolean}` – Enables/disables aria-multiline tags
|
106
106
|
* - **ariaValue** – `{boolean}` – Enables/disables aria-valuemin, aria-valuemax and aria-valuenow tags
|
107
107
|
* - **tabindex** – `{boolean}` – Enables/disables tabindex tags
|
108
|
-
* - **bindKeypress** – `{boolean}` – Enables/disables keypress event binding on
|
108
|
+
* - **bindKeypress** – `{boolean}` – Enables/disables keypress event binding on `<div>` and
|
109
|
+
* `<li>` elements with ng-click
|
109
110
|
*
|
110
111
|
* @description
|
111
112
|
* Enables/disables various ARIA attributes
|
@@ -133,6 +134,7 @@ function $AriaProvider() {
|
|
133
134
|
* @name $aria
|
134
135
|
*
|
135
136
|
* @description
|
137
|
+
* @priority 200
|
136
138
|
*
|
137
139
|
* The $aria service contains helper methods for applying common
|
138
140
|
* [ARIA](http://www.w3.org/TR/wai-aria/) attributes to HTML directives.
|
@@ -209,6 +211,7 @@ ngAriaModule.directive('ngShow', ['$aria', function($aria) {
|
|
209
211
|
return {
|
210
212
|
restrict: 'A',
|
211
213
|
require: '?ngModel',
|
214
|
+
priority: 200, //Make sure watches are fired after any other directives that affect the ngModel value
|
212
215
|
link: function(scope, elem, attr, ngModel) {
|
213
216
|
var shape = getShape(attr, elem);
|
214
217
|
var needsTabIndex = shouldAttachAttr('tabindex', 'tabindex', elem);
|
@@ -221,19 +224,19 @@ ngAriaModule.directive('ngShow', ['$aria', function($aria) {
|
|
221
224
|
if (needsTabIndex) {
|
222
225
|
needsTabIndex = false;
|
223
226
|
return function ngAriaRadioReaction(newVal) {
|
224
|
-
var boolVal =
|
227
|
+
var boolVal = (attr.value == ngModel.$viewValue);
|
225
228
|
elem.attr('aria-checked', boolVal);
|
226
229
|
elem.attr('tabindex', 0 - !boolVal);
|
227
230
|
};
|
228
231
|
} else {
|
229
232
|
return function ngAriaRadioReaction(newVal) {
|
230
|
-
elem.attr('aria-checked',
|
233
|
+
elem.attr('aria-checked', (attr.value == ngModel.$viewValue));
|
231
234
|
};
|
232
235
|
}
|
233
236
|
}
|
234
237
|
|
235
238
|
function ngAriaCheckboxReaction(newVal) {
|
236
|
-
elem.attr('aria-checked',
|
239
|
+
elem.attr('aria-checked', !ngModel.$isEmpty(ngModel.$viewValue));
|
237
240
|
}
|
238
241
|
|
239
242
|
switch (shape) {
|
@@ -308,11 +311,18 @@ ngAriaModule.directive('ngShow', ['$aria', function($aria) {
|
|
308
311
|
compile: function(elem, attr) {
|
309
312
|
var fn = $parse(attr.ngClick, /* interceptorFn */ null, /* expensiveChecks */ true);
|
310
313
|
return function(scope, elem, attr) {
|
314
|
+
|
315
|
+
function isNodeOneOf(elem, nodeTypeArray) {
|
316
|
+
if (nodeTypeArray.indexOf(elem[0].nodeName) !== -1) {
|
317
|
+
return true;
|
318
|
+
}
|
319
|
+
}
|
320
|
+
|
311
321
|
if ($aria.config('tabindex') && !elem.attr('tabindex')) {
|
312
322
|
elem.attr('tabindex', 0);
|
313
323
|
}
|
314
324
|
|
315
|
-
if ($aria.config('bindKeypress') && !attr.ngKeypress) {
|
325
|
+
if ($aria.config('bindKeypress') && !attr.ngKeypress && isNodeOneOf(elem, ['DIV', 'LI'])) {
|
316
326
|
elem.on('keypress', function(event) {
|
317
327
|
if (event.keyCode === 32 || event.keyCode === 13) {
|
318
328
|
scope.$apply(callback);
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.14
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -55,7 +55,7 @@ function minErr(module, ErrorConstructor) {
|
|
55
55
|
return match;
|
56
56
|
});
|
57
57
|
|
58
|
-
message = message + '\nhttp://errors.angularjs.org/1.3.
|
58
|
+
message = message + '\nhttp://errors.angularjs.org/1.3.14/' +
|
59
59
|
(module ? module + '/' : '') + code;
|
60
60
|
for (i = 2; i < arguments.length; i++) {
|
61
61
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.14
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -2134,18 +2134,32 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
|
|
2134
2134
|
if (window.jasmine || window.mocha) {
|
2135
2135
|
|
2136
2136
|
var currentSpec = null,
|
2137
|
+
annotatedFunctions = [],
|
2137
2138
|
isSpecRunning = function() {
|
2138
2139
|
return !!currentSpec;
|
2139
2140
|
};
|
2140
2141
|
|
2142
|
+
angular.mock.$$annotate = angular.injector.$$annotate;
|
2143
|
+
angular.injector.$$annotate = function(fn) {
|
2144
|
+
if (typeof fn === 'function' && !fn.$inject) {
|
2145
|
+
annotatedFunctions.push(fn);
|
2146
|
+
}
|
2147
|
+
return angular.mock.$$annotate.apply(this, arguments);
|
2148
|
+
};
|
2149
|
+
|
2141
2150
|
|
2142
2151
|
(window.beforeEach || window.setup)(function() {
|
2152
|
+
annotatedFunctions = [];
|
2143
2153
|
currentSpec = this;
|
2144
2154
|
});
|
2145
2155
|
|
2146
2156
|
(window.afterEach || window.teardown)(function() {
|
2147
2157
|
var injector = currentSpec.$injector;
|
2148
2158
|
|
2159
|
+
annotatedFunctions.forEach(function(fn) {
|
2160
|
+
delete fn.$inject;
|
2161
|
+
});
|
2162
|
+
|
2149
2163
|
angular.forEach(currentSpec.$modules, function(module) {
|
2150
2164
|
if (module && module.$$hashKey) {
|
2151
2165
|
module.$$hashKey = undefined;
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.14
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -213,6 +213,7 @@ function shallowClearAndCopy(src, dst) {
|
|
213
213
|
* - non-GET "class" actions: `Resource.action([parameters], postData, [success], [error])`
|
214
214
|
* - non-GET instance actions: `instance.$action([parameters], [success], [error])`
|
215
215
|
*
|
216
|
+
*
|
216
217
|
* Success callback is called with (value, responseHeaders) arguments. Error callback is called
|
217
218
|
* with (httpResponse) argument.
|
218
219
|
*
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.14
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -482,21 +482,15 @@ function $RouteProvider() {
|
|
482
482
|
* definitions will be interpolated into the location's path, while
|
483
483
|
* remaining properties will be treated as query params.
|
484
484
|
*
|
485
|
-
* @param {Object} newParams mapping of URL parameter names to values
|
485
|
+
* @param {!Object<string, string>} newParams mapping of URL parameter names to values
|
486
486
|
*/
|
487
487
|
updateParams: function(newParams) {
|
488
488
|
if (this.current && this.current.$$route) {
|
489
|
-
var searchParams = {}, self=this;
|
490
|
-
|
491
|
-
angular.forEach(Object.keys(newParams), function(key) {
|
492
|
-
if (!self.current.pathParams[key]) searchParams[key] = newParams[key];
|
493
|
-
});
|
494
|
-
|
495
489
|
newParams = angular.extend({}, this.current.params, newParams);
|
496
490
|
$location.path(interpolate(this.current.$$route.originalPath, newParams));
|
497
|
-
|
498
|
-
|
499
|
-
else {
|
491
|
+
// interpolate modifies newParams, only query params are left
|
492
|
+
$location.search(newParams);
|
493
|
+
} else {
|
500
494
|
throw $routeMinErr('norout', 'Tried updating route when with no current route');
|
501
495
|
}
|
502
496
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.14
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -276,14 +276,14 @@ function htmlParser(html, handler) {
|
|
276
276
|
}
|
277
277
|
}
|
278
278
|
var index, chars, match, stack = [], last = html, text;
|
279
|
-
stack.last = function() { return stack[
|
279
|
+
stack.last = function() { return stack[stack.length - 1]; };
|
280
280
|
|
281
281
|
while (html) {
|
282
282
|
text = '';
|
283
283
|
chars = true;
|
284
284
|
|
285
285
|
// Make sure we're not in a script or style element
|
286
|
-
if (!stack.last() || !specialElements[
|
286
|
+
if (!stack.last() || !specialElements[stack.last()]) {
|
287
287
|
|
288
288
|
// Comment
|
289
289
|
if (html.indexOf("<!--") === 0) {
|
@@ -341,7 +341,8 @@ function htmlParser(html, handler) {
|
|
341
341
|
}
|
342
342
|
|
343
343
|
} else {
|
344
|
-
|
344
|
+
// IE versions 9 and 10 do not understand the regex '[^]', so using a workaround with [\W\w].
|
345
|
+
html = html.replace(new RegExp("([\\W\\w]*)<\\s*\\/\\s*" + stack.last() + "[^>]*>", 'i'),
|
345
346
|
function(all, text) {
|
346
347
|
text = text.replace(COMMENT_REGEXP, "$1").replace(CDATA_REGEXP, "$1");
|
347
348
|
|
@@ -365,17 +366,17 @@ function htmlParser(html, handler) {
|
|
365
366
|
|
366
367
|
function parseStartTag(tag, tagName, rest, unary) {
|
367
368
|
tagName = angular.lowercase(tagName);
|
368
|
-
if (blockElements[
|
369
|
-
while (stack.last() && inlineElements[
|
369
|
+
if (blockElements[tagName]) {
|
370
|
+
while (stack.last() && inlineElements[stack.last()]) {
|
370
371
|
parseEndTag("", stack.last());
|
371
372
|
}
|
372
373
|
}
|
373
374
|
|
374
|
-
if (optionalEndTagElements[
|
375
|
+
if (optionalEndTagElements[tagName] && stack.last() == tagName) {
|
375
376
|
parseEndTag("", tagName);
|
376
377
|
}
|
377
378
|
|
378
|
-
unary = voidElements[
|
379
|
+
unary = voidElements[tagName] || !!unary;
|
379
380
|
|
380
381
|
if (!unary)
|
381
382
|
stack.push(tagName);
|
@@ -400,13 +401,13 @@ function htmlParser(html, handler) {
|
|
400
401
|
if (tagName)
|
401
402
|
// Find the closest opened tag of the same type
|
402
403
|
for (pos = stack.length - 1; pos >= 0; pos--)
|
403
|
-
if (stack[
|
404
|
+
if (stack[pos] == tagName)
|
404
405
|
break;
|
405
406
|
|
406
407
|
if (pos >= 0) {
|
407
408
|
// Close all the open elements, up the stack
|
408
409
|
for (i = stack.length - 1; i >= pos; i--)
|
409
|
-
if (handler.end) handler.end(stack[
|
410
|
+
if (handler.end) handler.end(stack[i]);
|
410
411
|
|
411
412
|
// Remove the open elements from the stack
|
412
413
|
stack.length = pos;
|
@@ -415,7 +416,6 @@ function htmlParser(html, handler) {
|
|
415
416
|
}
|
416
417
|
|
417
418
|
var hiddenPre=document.createElement("pre");
|
418
|
-
var spaceRe = /^(\s*)([\s\S]*?)(\s*)$/;
|
419
419
|
/**
|
420
420
|
* decodes all entities into regular string
|
421
421
|
* @param value
|
@@ -424,22 +424,10 @@ var spaceRe = /^(\s*)([\s\S]*?)(\s*)$/;
|
|
424
424
|
function decodeEntities(value) {
|
425
425
|
if (!value) { return ''; }
|
426
426
|
|
427
|
-
|
428
|
-
//
|
429
|
-
|
430
|
-
|
431
|
-
var spaceAfter = parts[3];
|
432
|
-
var content = parts[2];
|
433
|
-
if (content) {
|
434
|
-
hiddenPre.innerHTML=content.replace(/</g,"<");
|
435
|
-
// innerText depends on styling as it doesn't display hidden elements.
|
436
|
-
// Therefore, it's better to use textContent not to cause unnecessary
|
437
|
-
// reflows. However, IE<9 don't support textContent so the innerText
|
438
|
-
// fallback is necessary.
|
439
|
-
content = 'textContent' in hiddenPre ?
|
440
|
-
hiddenPre.textContent : hiddenPre.innerText;
|
441
|
-
}
|
442
|
-
return spaceBefore + content + spaceAfter;
|
427
|
+
hiddenPre.innerHTML = value.replace(/</g,"<");
|
428
|
+
// innerText depends on styling as it doesn't display hidden elements.
|
429
|
+
// Therefore, it's better to use textContent not to cause unnecessary reflows.
|
430
|
+
return hiddenPre.textContent;
|
443
431
|
}
|
444
432
|
|
445
433
|
/**
|
@@ -9190,7 +9190,7 @@ return jQuery;
|
|
9190
9190
|
}));
|
9191
9191
|
|
9192
9192
|
/**
|
9193
|
-
* @license AngularJS v1.3.
|
9193
|
+
* @license AngularJS v1.3.14
|
9194
9194
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
9195
9195
|
* License: MIT
|
9196
9196
|
*/
|
@@ -9246,7 +9246,7 @@ function minErr(module, ErrorConstructor) {
|
|
9246
9246
|
return match;
|
9247
9247
|
});
|
9248
9248
|
|
9249
|
-
message = message + '\nhttp://errors.angularjs.org/1.3.
|
9249
|
+
message = message + '\nhttp://errors.angularjs.org/1.3.14/' +
|
9250
9250
|
(module ? module + '/' : '') + code;
|
9251
9251
|
for (i = 2; i < arguments.length; i++) {
|
9252
9252
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
|
@@ -9573,8 +9573,7 @@ function nextUid() {
|
|
9573
9573
|
function setHashKey(obj, h) {
|
9574
9574
|
if (h) {
|
9575
9575
|
obj.$$hashKey = h;
|
9576
|
-
}
|
9577
|
-
else {
|
9576
|
+
} else {
|
9578
9577
|
delete obj.$$hashKey;
|
9579
9578
|
}
|
9580
9579
|
}
|
@@ -9883,7 +9882,7 @@ function isElement(node) {
|
|
9883
9882
|
function makeMap(str) {
|
9884
9883
|
var obj = {}, items = str.split(","), i;
|
9885
9884
|
for (i = 0; i < items.length; i++)
|
9886
|
-
obj[
|
9885
|
+
obj[items[i]] = true;
|
9887
9886
|
return obj;
|
9888
9887
|
}
|
9889
9888
|
|
@@ -10664,8 +10663,12 @@ function bootstrap(element, modules, config) {
|
|
10664
10663
|
forEach(extraModules, function(module) {
|
10665
10664
|
modules.push(module);
|
10666
10665
|
});
|
10667
|
-
doBootstrap();
|
10666
|
+
return doBootstrap();
|
10668
10667
|
};
|
10668
|
+
|
10669
|
+
if (isFunction(angular.resumeDeferredBootstrap)) {
|
10670
|
+
angular.resumeDeferredBootstrap();
|
10671
|
+
}
|
10669
10672
|
}
|
10670
10673
|
|
10671
10674
|
/**
|
@@ -11310,11 +11313,11 @@ function toDebugString(obj) {
|
|
11310
11313
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
11311
11314
|
*/
|
11312
11315
|
var version = {
|
11313
|
-
full: '1.3.
|
11316
|
+
full: '1.3.14', // all of these placeholder strings will be replaced by grunt's
|
11314
11317
|
major: 1, // package task
|
11315
11318
|
minor: 3,
|
11316
|
-
dot:
|
11317
|
-
codeName: '
|
11319
|
+
dot: 14,
|
11320
|
+
codeName: 'instantaneous-browserification'
|
11318
11321
|
};
|
11319
11322
|
|
11320
11323
|
|
@@ -13349,7 +13352,7 @@ function createInjector(modulesToLoad, strictDi) {
|
|
13349
13352
|
}
|
13350
13353
|
|
13351
13354
|
var args = [],
|
13352
|
-
$inject = annotate(fn, strictDi, serviceName),
|
13355
|
+
$inject = createInjector.$$annotate(fn, strictDi, serviceName),
|
13353
13356
|
length, i,
|
13354
13357
|
key;
|
13355
13358
|
|
@@ -13388,7 +13391,7 @@ function createInjector(modulesToLoad, strictDi) {
|
|
13388
13391
|
invoke: invoke,
|
13389
13392
|
instantiate: instantiate,
|
13390
13393
|
get: getService,
|
13391
|
-
annotate: annotate,
|
13394
|
+
annotate: createInjector.$$annotate,
|
13392
13395
|
has: function(name) {
|
13393
13396
|
return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name);
|
13394
13397
|
}
|
@@ -17062,8 +17065,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
17062
17065
|
afterTemplateChildLinkFn,
|
17063
17066
|
beforeTemplateCompileNode = $compileNode[0],
|
17064
17067
|
origAsyncDirective = directives.shift(),
|
17065
|
-
|
17066
|
-
derivedSyncDirective = extend({}, origAsyncDirective, {
|
17068
|
+
derivedSyncDirective = inherit(origAsyncDirective, {
|
17067
17069
|
templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective
|
17068
17070
|
}),
|
17069
17071
|
templateUrl = (isFunction(origAsyncDirective.templateUrl))
|
@@ -17516,6 +17518,8 @@ function removeComments(jqNodes) {
|
|
17516
17518
|
return jqNodes;
|
17517
17519
|
}
|
17518
17520
|
|
17521
|
+
var $controllerMinErr = minErr('$controller');
|
17522
|
+
|
17519
17523
|
/**
|
17520
17524
|
* @ngdoc provider
|
17521
17525
|
* @name $controllerProvider
|
@@ -17603,7 +17607,12 @@ function $ControllerProvider() {
|
|
17603
17607
|
}
|
17604
17608
|
|
17605
17609
|
if (isString(expression)) {
|
17606
|
-
match = expression.match(CNTRL_REG)
|
17610
|
+
match = expression.match(CNTRL_REG);
|
17611
|
+
if (!match) {
|
17612
|
+
throw $controllerMinErr('ctrlfmt',
|
17613
|
+
"Badly formed controller string '{0}'. " +
|
17614
|
+
"Must match `__name__ as __id__` or `__name__`.", expression);
|
17615
|
+
}
|
17607
17616
|
constructor = match[1],
|
17608
17617
|
identifier = identifier || match[3];
|
17609
17618
|
expression = controllers.hasOwnProperty(constructor)
|
@@ -20512,7 +20521,7 @@ function $LocationProvider() {
|
|
20512
20521
|
// TODO(vojta): rewrite link when opening in new tab/window (in legacy browser)
|
20513
20522
|
// currently we open nice url link and redirect then
|
20514
20523
|
|
20515
|
-
if (!html5Mode.rewriteLinks || event.ctrlKey || event.metaKey || event.which == 2) return;
|
20524
|
+
if (!html5Mode.rewriteLinks || event.ctrlKey || event.metaKey || event.shiftKey || event.which == 2 || event.button == 2) return;
|
20516
20525
|
|
20517
20526
|
var elm = jqLite(event.target);
|
20518
20527
|
|
@@ -20554,7 +20563,7 @@ function $LocationProvider() {
|
|
20554
20563
|
|
20555
20564
|
|
20556
20565
|
// rewrite hashbang url <> html5 url
|
20557
|
-
if ($location.absUrl() != initialUrl) {
|
20566
|
+
if (trimEmptyHash($location.absUrl()) != trimEmptyHash(initialUrl)) {
|
20558
20567
|
$browser.url($location.absUrl(), true);
|
20559
20568
|
}
|
20560
20569
|
|
@@ -21528,6 +21537,11 @@ Parser.prototype = {
|
|
21528
21537
|
? fn.apply(context, args)
|
21529
21538
|
: fn(args[0], args[1], args[2], args[3], args[4]);
|
21530
21539
|
|
21540
|
+
if (args) {
|
21541
|
+
// Free-up the memory (arguments of the last function call).
|
21542
|
+
args.length = 0;
|
21543
|
+
}
|
21544
|
+
|
21531
21545
|
return ensureSafeObject(v, expressionText);
|
21532
21546
|
};
|
21533
21547
|
},
|
@@ -22399,8 +22413,7 @@ function qFactory(nextTick, exceptionHandler) {
|
|
22399
22413
|
'qcycle',
|
22400
22414
|
"Expected promise to be resolved with value other than itself '{0}'",
|
22401
22415
|
val));
|
22402
|
-
}
|
22403
|
-
else {
|
22416
|
+
} else {
|
22404
22417
|
this.$$resolve(val);
|
22405
22418
|
}
|
22406
22419
|
|
@@ -26857,6 +26870,9 @@ var htmlAnchorDirective = valueFn({
|
|
26857
26870
|
compile: function(element, attr) {
|
26858
26871
|
if (!attr.href && !attr.xlinkHref && !attr.name) {
|
26859
26872
|
return function(scope, element) {
|
26873
|
+
// If the linked element is not an anchor tag anymore, do nothing
|
26874
|
+
if (element[0].nodeName.toLowerCase() !== 'a') return;
|
26875
|
+
|
26860
26876
|
// SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute.
|
26861
26877
|
var href = toString.call(element.prop('href')) === '[object SVGAnimatedString]' ?
|
26862
26878
|
'xlink:href' : 'href';
|
@@ -27030,20 +27046,23 @@ var htmlAnchorDirective = valueFn({
|
|
27030
27046
|
*
|
27031
27047
|
* @description
|
27032
27048
|
*
|
27033
|
-
*
|
27049
|
+
* This directive sets the `disabled` attribute on the element if the
|
27050
|
+
* {@link guide/expression expression} inside `ngDisabled` evaluates to truthy.
|
27051
|
+
*
|
27052
|
+
* A special directive is necessary because we cannot use interpolation inside the `disabled`
|
27053
|
+
* attribute. The following example would make the button enabled on Chrome/Firefox
|
27054
|
+
* but not on older IEs:
|
27055
|
+
*
|
27034
27056
|
* ```html
|
27035
|
-
* <div ng-init="
|
27036
|
-
* <button disabled="{{
|
27057
|
+
* <div ng-init="isDisabled = false">
|
27058
|
+
* <button disabled="{{isDisabled}}">Disabled</button>
|
27037
27059
|
* </div>
|
27038
27060
|
* ```
|
27039
27061
|
*
|
27040
|
-
*
|
27041
|
-
* such as disabled
|
27062
|
+
* This is because the HTML specification does not require browsers to preserve the values of
|
27063
|
+
* boolean attributes such as `disabled` (Their presence means true and their absence means false.)
|
27042
27064
|
* If we put an Angular interpolation expression into such an attribute then the
|
27043
27065
|
* binding information would be lost when the browser removes the attribute.
|
27044
|
-
* The `ngDisabled` directive solves this problem for the `disabled` attribute.
|
27045
|
-
* This complementary directive is not removed by the browser and so provides
|
27046
|
-
* a permanent reliable place to store the binding information.
|
27047
27066
|
*
|
27048
27067
|
* @example
|
27049
27068
|
<example>
|
@@ -27062,7 +27081,7 @@ var htmlAnchorDirective = valueFn({
|
|
27062
27081
|
*
|
27063
27082
|
* @element INPUT
|
27064
27083
|
* @param {expression} ngDisabled If the {@link guide/expression expression} is truthy,
|
27065
|
-
* then
|
27084
|
+
* then the `disabled` attribute will be set on the element
|
27066
27085
|
*/
|
27067
27086
|
|
27068
27087
|
|
@@ -27875,19 +27894,21 @@ var inputType = {
|
|
27875
27894
|
<script>
|
27876
27895
|
angular.module('textInputExample', [])
|
27877
27896
|
.controller('ExampleController', ['$scope', function($scope) {
|
27878
|
-
$scope.
|
27879
|
-
|
27897
|
+
$scope.example = {
|
27898
|
+
text: 'guest',
|
27899
|
+
word: /^\s*\w*\s*$/
|
27900
|
+
};
|
27880
27901
|
}]);
|
27881
27902
|
</script>
|
27882
27903
|
<form name="myForm" ng-controller="ExampleController">
|
27883
|
-
Single word: <input type="text" name="input" ng-model="text"
|
27884
|
-
ng-pattern="word" required ng-trim="false">
|
27904
|
+
Single word: <input type="text" name="input" ng-model="example.text"
|
27905
|
+
ng-pattern="example.word" required ng-trim="false">
|
27885
27906
|
<span class="error" ng-show="myForm.input.$error.required">
|
27886
27907
|
Required!</span>
|
27887
27908
|
<span class="error" ng-show="myForm.input.$error.pattern">
|
27888
27909
|
Single word only!</span>
|
27889
27910
|
|
27890
|
-
<tt>text = {{text}}</tt><br/>
|
27911
|
+
<tt>text = {{example.text}}</tt><br/>
|
27891
27912
|
<tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
|
27892
27913
|
<tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
|
27893
27914
|
<tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
|
@@ -27895,9 +27916,9 @@ var inputType = {
|
|
27895
27916
|
</form>
|
27896
27917
|
</file>
|
27897
27918
|
<file name="protractor.js" type="protractor">
|
27898
|
-
var text = element(by.binding('text'));
|
27919
|
+
var text = element(by.binding('example.text'));
|
27899
27920
|
var valid = element(by.binding('myForm.input.$valid'));
|
27900
|
-
var input = element(by.model('text'));
|
27921
|
+
var input = element(by.model('example.text'));
|
27901
27922
|
|
27902
27923
|
it('should initialize to model', function() {
|
27903
27924
|
expect(text.getText()).toContain('guest');
|
@@ -27959,18 +27980,20 @@ var inputType = {
|
|
27959
27980
|
<script>
|
27960
27981
|
angular.module('dateInputExample', [])
|
27961
27982
|
.controller('DateController', ['$scope', function($scope) {
|
27962
|
-
$scope.
|
27983
|
+
$scope.example = {
|
27984
|
+
value: new Date(2013, 9, 22)
|
27985
|
+
};
|
27963
27986
|
}]);
|
27964
27987
|
</script>
|
27965
27988
|
<form name="myForm" ng-controller="DateController as dateCtrl">
|
27966
27989
|
Pick a date in 2013:
|
27967
|
-
<input type="date" id="exampleInput" name="input" ng-model="value"
|
27990
|
+
<input type="date" id="exampleInput" name="input" ng-model="example.value"
|
27968
27991
|
placeholder="yyyy-MM-dd" min="2013-01-01" max="2013-12-31" required />
|
27969
27992
|
<span class="error" ng-show="myForm.input.$error.required">
|
27970
27993
|
Required!</span>
|
27971
27994
|
<span class="error" ng-show="myForm.input.$error.date">
|
27972
27995
|
Not a valid date!</span>
|
27973
|
-
<tt>value = {{value | date: "yyyy-MM-dd"}}</tt><br/>
|
27996
|
+
<tt>value = {{example.value | date: "yyyy-MM-dd"}}</tt><br/>
|
27974
27997
|
<tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
|
27975
27998
|
<tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
|
27976
27999
|
<tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
|
@@ -27978,9 +28001,9 @@ var inputType = {
|
|
27978
28001
|
</form>
|
27979
28002
|
</file>
|
27980
28003
|
<file name="protractor.js" type="protractor">
|
27981
|
-
var value = element(by.binding('value | date: "yyyy-MM-dd"'));
|
28004
|
+
var value = element(by.binding('example.value | date: "yyyy-MM-dd"'));
|
27982
28005
|
var valid = element(by.binding('myForm.input.$valid'));
|
27983
|
-
var input = element(by.model('value'));
|
28006
|
+
var input = element(by.model('example.value'));
|
27984
28007
|
|
27985
28008
|
// currently protractor/webdriver does not support
|
27986
28009
|
// sending keys to all known HTML5 input controls
|
@@ -28050,18 +28073,20 @@ var inputType = {
|
|
28050
28073
|
<script>
|
28051
28074
|
angular.module('dateExample', [])
|
28052
28075
|
.controller('DateController', ['$scope', function($scope) {
|
28053
|
-
$scope.
|
28076
|
+
$scope.example = {
|
28077
|
+
value: new Date(2010, 11, 28, 14, 57)
|
28078
|
+
};
|
28054
28079
|
}]);
|
28055
28080
|
</script>
|
28056
28081
|
<form name="myForm" ng-controller="DateController as dateCtrl">
|
28057
28082
|
Pick a date between in 2013:
|
28058
|
-
<input type="datetime-local" id="exampleInput" name="input" ng-model="value"
|
28083
|
+
<input type="datetime-local" id="exampleInput" name="input" ng-model="example.value"
|
28059
28084
|
placeholder="yyyy-MM-ddTHH:mm:ss" min="2001-01-01T00:00:00" max="2013-12-31T00:00:00" required />
|
28060
28085
|
<span class="error" ng-show="myForm.input.$error.required">
|
28061
28086
|
Required!</span>
|
28062
28087
|
<span class="error" ng-show="myForm.input.$error.datetimelocal">
|
28063
28088
|
Not a valid date!</span>
|
28064
|
-
<tt>value = {{value | date: "yyyy-MM-ddTHH:mm:ss"}}</tt><br/>
|
28089
|
+
<tt>value = {{example.value | date: "yyyy-MM-ddTHH:mm:ss"}}</tt><br/>
|
28065
28090
|
<tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
|
28066
28091
|
<tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
|
28067
28092
|
<tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
|
@@ -28069,9 +28094,9 @@ var inputType = {
|
|
28069
28094
|
</form>
|
28070
28095
|
</file>
|
28071
28096
|
<file name="protractor.js" type="protractor">
|
28072
|
-
var value = element(by.binding('value | date: "yyyy-MM-ddTHH:mm:ss"'));
|
28097
|
+
var value = element(by.binding('example.value | date: "yyyy-MM-ddTHH:mm:ss"'));
|
28073
28098
|
var valid = element(by.binding('myForm.input.$valid'));
|
28074
|
-
var input = element(by.model('value'));
|
28099
|
+
var input = element(by.model('example.value'));
|
28075
28100
|
|
28076
28101
|
// currently protractor/webdriver does not support
|
28077
28102
|
// sending keys to all known HTML5 input controls
|
@@ -28142,18 +28167,20 @@ var inputType = {
|
|
28142
28167
|
<script>
|
28143
28168
|
angular.module('timeExample', [])
|
28144
28169
|
.controller('DateController', ['$scope', function($scope) {
|
28145
|
-
$scope.
|
28170
|
+
$scope.example = {
|
28171
|
+
value: new Date(1970, 0, 1, 14, 57, 0)
|
28172
|
+
};
|
28146
28173
|
}]);
|
28147
28174
|
</script>
|
28148
28175
|
<form name="myForm" ng-controller="DateController as dateCtrl">
|
28149
28176
|
Pick a between 8am and 5pm:
|
28150
|
-
<input type="time" id="exampleInput" name="input" ng-model="value"
|
28177
|
+
<input type="time" id="exampleInput" name="input" ng-model="example.value"
|
28151
28178
|
placeholder="HH:mm:ss" min="08:00:00" max="17:00:00" required />
|
28152
28179
|
<span class="error" ng-show="myForm.input.$error.required">
|
28153
28180
|
Required!</span>
|
28154
28181
|
<span class="error" ng-show="myForm.input.$error.time">
|
28155
28182
|
Not a valid date!</span>
|
28156
|
-
<tt>value = {{value | date: "HH:mm:ss"}}</tt><br/>
|
28183
|
+
<tt>value = {{example.value | date: "HH:mm:ss"}}</tt><br/>
|
28157
28184
|
<tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
|
28158
28185
|
<tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
|
28159
28186
|
<tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
|
@@ -28161,9 +28188,9 @@ var inputType = {
|
|
28161
28188
|
</form>
|
28162
28189
|
</file>
|
28163
28190
|
<file name="protractor.js" type="protractor">
|
28164
|
-
var value = element(by.binding('value | date: "HH:mm:ss"'));
|
28191
|
+
var value = element(by.binding('example.value | date: "HH:mm:ss"'));
|
28165
28192
|
var valid = element(by.binding('myForm.input.$valid'));
|
28166
|
-
var input = element(by.model('value'));
|
28193
|
+
var input = element(by.model('example.value'));
|
28167
28194
|
|
28168
28195
|
// currently protractor/webdriver does not support
|
28169
28196
|
// sending keys to all known HTML5 input controls
|
@@ -28233,18 +28260,20 @@ var inputType = {
|
|
28233
28260
|
<script>
|
28234
28261
|
angular.module('weekExample', [])
|
28235
28262
|
.controller('DateController', ['$scope', function($scope) {
|
28236
|
-
$scope.
|
28263
|
+
$scope.example = {
|
28264
|
+
value: new Date(2013, 0, 3)
|
28265
|
+
};
|
28237
28266
|
}]);
|
28238
28267
|
</script>
|
28239
28268
|
<form name="myForm" ng-controller="DateController as dateCtrl">
|
28240
28269
|
Pick a date between in 2013:
|
28241
|
-
<input id="exampleInput" type="week" name="input" ng-model="value"
|
28270
|
+
<input id="exampleInput" type="week" name="input" ng-model="example.value"
|
28242
28271
|
placeholder="YYYY-W##" min="2012-W32" max="2013-W52" required />
|
28243
28272
|
<span class="error" ng-show="myForm.input.$error.required">
|
28244
28273
|
Required!</span>
|
28245
28274
|
<span class="error" ng-show="myForm.input.$error.week">
|
28246
28275
|
Not a valid date!</span>
|
28247
|
-
<tt>value = {{value | date: "yyyy-Www"}}</tt><br/>
|
28276
|
+
<tt>value = {{example.value | date: "yyyy-Www"}}</tt><br/>
|
28248
28277
|
<tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
|
28249
28278
|
<tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
|
28250
28279
|
<tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
|
@@ -28252,9 +28281,9 @@ var inputType = {
|
|
28252
28281
|
</form>
|
28253
28282
|
</file>
|
28254
28283
|
<file name="protractor.js" type="protractor">
|
28255
|
-
var value = element(by.binding('value | date: "yyyy-Www"'));
|
28284
|
+
var value = element(by.binding('example.value | date: "yyyy-Www"'));
|
28256
28285
|
var valid = element(by.binding('myForm.input.$valid'));
|
28257
|
-
var input = element(by.model('value'));
|
28286
|
+
var input = element(by.model('example.value'));
|
28258
28287
|
|
28259
28288
|
// currently protractor/webdriver does not support
|
28260
28289
|
// sending keys to all known HTML5 input controls
|
@@ -28324,18 +28353,20 @@ var inputType = {
|
|
28324
28353
|
<script>
|
28325
28354
|
angular.module('monthExample', [])
|
28326
28355
|
.controller('DateController', ['$scope', function($scope) {
|
28327
|
-
$scope.
|
28356
|
+
$scope.example = {
|
28357
|
+
value: new Date(2013, 9, 1)
|
28358
|
+
};
|
28328
28359
|
}]);
|
28329
28360
|
</script>
|
28330
28361
|
<form name="myForm" ng-controller="DateController as dateCtrl">
|
28331
|
-
Pick a month
|
28332
|
-
<input id="exampleInput" type="month" name="input" ng-model="value"
|
28362
|
+
Pick a month in 2013:
|
28363
|
+
<input id="exampleInput" type="month" name="input" ng-model="example.value"
|
28333
28364
|
placeholder="yyyy-MM" min="2013-01" max="2013-12" required />
|
28334
28365
|
<span class="error" ng-show="myForm.input.$error.required">
|
28335
28366
|
Required!</span>
|
28336
28367
|
<span class="error" ng-show="myForm.input.$error.month">
|
28337
28368
|
Not a valid month!</span>
|
28338
|
-
<tt>value = {{value | date: "yyyy-MM"}}</tt><br/>
|
28369
|
+
<tt>value = {{example.value | date: "yyyy-MM"}}</tt><br/>
|
28339
28370
|
<tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
|
28340
28371
|
<tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
|
28341
28372
|
<tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
|
@@ -28343,9 +28374,9 @@ var inputType = {
|
|
28343
28374
|
</form>
|
28344
28375
|
</file>
|
28345
28376
|
<file name="protractor.js" type="protractor">
|
28346
|
-
var value = element(by.binding('value | date: "yyyy-MM"'));
|
28377
|
+
var value = element(by.binding('example.value | date: "yyyy-MM"'));
|
28347
28378
|
var valid = element(by.binding('myForm.input.$valid'));
|
28348
|
-
var input = element(by.model('value'));
|
28379
|
+
var input = element(by.model('example.value'));
|
28349
28380
|
|
28350
28381
|
// currently protractor/webdriver does not support
|
28351
28382
|
// sending keys to all known HTML5 input controls
|
@@ -28421,17 +28452,19 @@ var inputType = {
|
|
28421
28452
|
<script>
|
28422
28453
|
angular.module('numberExample', [])
|
28423
28454
|
.controller('ExampleController', ['$scope', function($scope) {
|
28424
|
-
$scope.
|
28455
|
+
$scope.example = {
|
28456
|
+
value: 12
|
28457
|
+
};
|
28425
28458
|
}]);
|
28426
28459
|
</script>
|
28427
28460
|
<form name="myForm" ng-controller="ExampleController">
|
28428
|
-
Number: <input type="number" name="input" ng-model="value"
|
28461
|
+
Number: <input type="number" name="input" ng-model="example.value"
|
28429
28462
|
min="0" max="99" required>
|
28430
28463
|
<span class="error" ng-show="myForm.input.$error.required">
|
28431
28464
|
Required!</span>
|
28432
28465
|
<span class="error" ng-show="myForm.input.$error.number">
|
28433
28466
|
Not valid number!</span>
|
28434
|
-
<tt>value = {{value}}</tt><br/>
|
28467
|
+
<tt>value = {{example.value}}</tt><br/>
|
28435
28468
|
<tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
|
28436
28469
|
<tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
|
28437
28470
|
<tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
|
@@ -28439,9 +28472,9 @@ var inputType = {
|
|
28439
28472
|
</form>
|
28440
28473
|
</file>
|
28441
28474
|
<file name="protractor.js" type="protractor">
|
28442
|
-
var value = element(by.binding('value'));
|
28475
|
+
var value = element(by.binding('example.value'));
|
28443
28476
|
var valid = element(by.binding('myForm.input.$valid'));
|
28444
|
-
var input = element(by.model('value'));
|
28477
|
+
var input = element(by.model('example.value'));
|
28445
28478
|
|
28446
28479
|
it('should initialize to model', function() {
|
28447
28480
|
expect(value.getText()).toContain('12');
|
@@ -28509,16 +28542,18 @@ var inputType = {
|
|
28509
28542
|
<script>
|
28510
28543
|
angular.module('urlExample', [])
|
28511
28544
|
.controller('ExampleController', ['$scope', function($scope) {
|
28512
|
-
$scope.
|
28545
|
+
$scope.url = {
|
28546
|
+
text: 'http://google.com'
|
28547
|
+
};
|
28513
28548
|
}]);
|
28514
28549
|
</script>
|
28515
28550
|
<form name="myForm" ng-controller="ExampleController">
|
28516
|
-
URL: <input type="url" name="input" ng-model="text" required>
|
28551
|
+
URL: <input type="url" name="input" ng-model="url.text" required>
|
28517
28552
|
<span class="error" ng-show="myForm.input.$error.required">
|
28518
28553
|
Required!</span>
|
28519
28554
|
<span class="error" ng-show="myForm.input.$error.url">
|
28520
28555
|
Not valid url!</span>
|
28521
|
-
<tt>text = {{text}}</tt><br/>
|
28556
|
+
<tt>text = {{url.text}}</tt><br/>
|
28522
28557
|
<tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
|
28523
28558
|
<tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
|
28524
28559
|
<tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
|
@@ -28527,9 +28562,9 @@ var inputType = {
|
|
28527
28562
|
</form>
|
28528
28563
|
</file>
|
28529
28564
|
<file name="protractor.js" type="protractor">
|
28530
|
-
var text = element(by.binding('text'));
|
28565
|
+
var text = element(by.binding('url.text'));
|
28531
28566
|
var valid = element(by.binding('myForm.input.$valid'));
|
28532
|
-
var input = element(by.model('text'));
|
28567
|
+
var input = element(by.model('url.text'));
|
28533
28568
|
|
28534
28569
|
it('should initialize to model', function() {
|
28535
28570
|
expect(text.getText()).toContain('http://google.com');
|
@@ -28598,16 +28633,18 @@ var inputType = {
|
|
28598
28633
|
<script>
|
28599
28634
|
angular.module('emailExample', [])
|
28600
28635
|
.controller('ExampleController', ['$scope', function($scope) {
|
28601
|
-
$scope.
|
28636
|
+
$scope.email = {
|
28637
|
+
text: 'me@example.com'
|
28638
|
+
};
|
28602
28639
|
}]);
|
28603
28640
|
</script>
|
28604
28641
|
<form name="myForm" ng-controller="ExampleController">
|
28605
|
-
Email: <input type="email" name="input" ng-model="text" required>
|
28642
|
+
Email: <input type="email" name="input" ng-model="email.text" required>
|
28606
28643
|
<span class="error" ng-show="myForm.input.$error.required">
|
28607
28644
|
Required!</span>
|
28608
28645
|
<span class="error" ng-show="myForm.input.$error.email">
|
28609
28646
|
Not valid email!</span>
|
28610
|
-
<tt>text = {{text}}</tt><br/>
|
28647
|
+
<tt>text = {{email.text}}</tt><br/>
|
28611
28648
|
<tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
|
28612
28649
|
<tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
|
28613
28650
|
<tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
|
@@ -28616,9 +28653,9 @@ var inputType = {
|
|
28616
28653
|
</form>
|
28617
28654
|
</file>
|
28618
28655
|
<file name="protractor.js" type="protractor">
|
28619
|
-
var text = element(by.binding('text'));
|
28656
|
+
var text = element(by.binding('email.text'));
|
28620
28657
|
var valid = element(by.binding('myForm.input.$valid'));
|
28621
|
-
var input = element(by.model('text'));
|
28658
|
+
var input = element(by.model('email.text'));
|
28622
28659
|
|
28623
28660
|
it('should initialize to model', function() {
|
28624
28661
|
expect(text.getText()).toContain('me@example.com');
|
@@ -28665,7 +28702,9 @@ var inputType = {
|
|
28665
28702
|
<script>
|
28666
28703
|
angular.module('radioExample', [])
|
28667
28704
|
.controller('ExampleController', ['$scope', function($scope) {
|
28668
|
-
$scope.color =
|
28705
|
+
$scope.color = {
|
28706
|
+
name: 'blue'
|
28707
|
+
};
|
28669
28708
|
$scope.specialValue = {
|
28670
28709
|
"id": "12345",
|
28671
28710
|
"value": "green"
|
@@ -28673,20 +28712,20 @@ var inputType = {
|
|
28673
28712
|
}]);
|
28674
28713
|
</script>
|
28675
28714
|
<form name="myForm" ng-controller="ExampleController">
|
28676
|
-
<input type="radio" ng-model="color" value="red"> Red <br/>
|
28677
|
-
<input type="radio" ng-model="color" ng-value="specialValue"> Green <br/>
|
28678
|
-
<input type="radio" ng-model="color" value="blue"> Blue <br/>
|
28679
|
-
<tt>color = {{color | json}}</tt><br/>
|
28715
|
+
<input type="radio" ng-model="color.name" value="red"> Red <br/>
|
28716
|
+
<input type="radio" ng-model="color.name" ng-value="specialValue"> Green <br/>
|
28717
|
+
<input type="radio" ng-model="color.name" value="blue"> Blue <br/>
|
28718
|
+
<tt>color = {{color.name | json}}</tt><br/>
|
28680
28719
|
</form>
|
28681
28720
|
Note that `ng-value="specialValue"` sets radio item's value to be the value of `$scope.specialValue`.
|
28682
28721
|
</file>
|
28683
28722
|
<file name="protractor.js" type="protractor">
|
28684
28723
|
it('should change state', function() {
|
28685
|
-
var color = element(by.binding('color'));
|
28724
|
+
var color = element(by.binding('color.name'));
|
28686
28725
|
|
28687
28726
|
expect(color.getText()).toContain('blue');
|
28688
28727
|
|
28689
|
-
element.all(by.model('color')).get(0).click();
|
28728
|
+
element.all(by.model('color.name')).get(0).click();
|
28690
28729
|
|
28691
28730
|
expect(color.getText()).toContain('red');
|
28692
28731
|
});
|
@@ -28716,28 +28755,30 @@ var inputType = {
|
|
28716
28755
|
<script>
|
28717
28756
|
angular.module('checkboxExample', [])
|
28718
28757
|
.controller('ExampleController', ['$scope', function($scope) {
|
28719
|
-
$scope.
|
28720
|
-
|
28758
|
+
$scope.checkboxModel = {
|
28759
|
+
value1 : true,
|
28760
|
+
value2 : 'YES'
|
28761
|
+
};
|
28721
28762
|
}]);
|
28722
28763
|
</script>
|
28723
28764
|
<form name="myForm" ng-controller="ExampleController">
|
28724
|
-
Value1: <input type="checkbox" ng-model="value1"> <br/>
|
28725
|
-
Value2: <input type="checkbox" ng-model="value2"
|
28765
|
+
Value1: <input type="checkbox" ng-model="checkboxModel.value1"> <br/>
|
28766
|
+
Value2: <input type="checkbox" ng-model="checkboxModel.value2"
|
28726
28767
|
ng-true-value="'YES'" ng-false-value="'NO'"> <br/>
|
28727
|
-
<tt>value1 = {{value1}}</tt><br/>
|
28728
|
-
<tt>value2 = {{value2}}</tt><br/>
|
28768
|
+
<tt>value1 = {{checkboxModel.value1}}</tt><br/>
|
28769
|
+
<tt>value2 = {{checkboxModel.value2}}</tt><br/>
|
28729
28770
|
</form>
|
28730
28771
|
</file>
|
28731
28772
|
<file name="protractor.js" type="protractor">
|
28732
28773
|
it('should change state', function() {
|
28733
|
-
var value1 = element(by.binding('value1'));
|
28734
|
-
var value2 = element(by.binding('value2'));
|
28774
|
+
var value1 = element(by.binding('checkboxModel.value1'));
|
28775
|
+
var value2 = element(by.binding('checkboxModel.value2'));
|
28735
28776
|
|
28736
28777
|
expect(value1.getText()).toContain('true');
|
28737
28778
|
expect(value2.getText()).toContain('YES');
|
28738
28779
|
|
28739
|
-
element(by.model('value1')).click();
|
28740
|
-
element(by.model('value2')).click();
|
28780
|
+
element(by.model('checkboxModel.value1')).click();
|
28781
|
+
element(by.model('checkboxModel.value2')).click();
|
28741
28782
|
|
28742
28783
|
expect(value1.getText()).toContain('false');
|
28743
28784
|
expect(value2.getText()).toContain('NO');
|
@@ -29042,7 +29083,7 @@ function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
29042
29083
|
return value;
|
29043
29084
|
});
|
29044
29085
|
|
29045
|
-
if (attr.min || attr.ngMin) {
|
29086
|
+
if (isDefined(attr.min) || attr.ngMin) {
|
29046
29087
|
var minVal;
|
29047
29088
|
ctrl.$validators.min = function(value) {
|
29048
29089
|
return ctrl.$isEmpty(value) || isUndefined(minVal) || value >= minVal;
|
@@ -29058,7 +29099,7 @@ function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
29058
29099
|
});
|
29059
29100
|
}
|
29060
29101
|
|
29061
|
-
if (attr.max || attr.ngMax) {
|
29102
|
+
if (isDefined(attr.max) || attr.ngMax) {
|
29062
29103
|
var maxVal;
|
29063
29104
|
ctrl.$validators.max = function(value) {
|
29064
29105
|
return ctrl.$isEmpty(value) || isUndefined(maxVal) || value <= maxVal;
|
@@ -31446,7 +31487,7 @@ var ngIncludeFillContentDirective = ['$compile',
|
|
31446
31487
|
* **Note**: If you have assignment in `ngInit` along with {@link ng.$filter `$filter`}, make
|
31447
31488
|
* sure you have parenthesis for correct precedence:
|
31448
31489
|
* <pre class="prettyprint">
|
31449
|
-
*
|
31490
|
+
* `<div ng-init="test1 = (data | orderBy:'name')"></div>`
|
31450
31491
|
* </pre>
|
31451
31492
|
* </div>
|
31452
31493
|
*
|
@@ -31864,6 +31905,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
31864
31905
|
ngModelGet = parsedNgModel,
|
31865
31906
|
ngModelSet = parsedNgModelAssign,
|
31866
31907
|
pendingDebounce = null,
|
31908
|
+
parserValid,
|
31867
31909
|
ctrl = this;
|
31868
31910
|
|
31869
31911
|
this.$$setOptions = function(options) {
|
@@ -32136,16 +32178,12 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
32136
32178
|
// the model although neither viewValue nor the model on the scope changed
|
32137
32179
|
var modelValue = ctrl.$$rawModelValue;
|
32138
32180
|
|
32139
|
-
// Check if the there's a parse error, so we don't unset it accidentially
|
32140
|
-
var parserName = ctrl.$$parserName || 'parse';
|
32141
|
-
var parserValid = ctrl.$error[parserName] ? false : undefined;
|
32142
|
-
|
32143
32181
|
var prevValid = ctrl.$valid;
|
32144
32182
|
var prevModelValue = ctrl.$modelValue;
|
32145
32183
|
|
32146
32184
|
var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid;
|
32147
32185
|
|
32148
|
-
ctrl.$$runValidators(
|
32186
|
+
ctrl.$$runValidators(modelValue, viewValue, function(allValid) {
|
32149
32187
|
// If there was no change in validity, don't update the model
|
32150
32188
|
// This prevents changing an invalid modelValue to undefined
|
32151
32189
|
if (!allowInvalid && prevValid !== allValid) {
|
@@ -32163,12 +32201,12 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
32163
32201
|
|
32164
32202
|
};
|
32165
32203
|
|
32166
|
-
this.$$runValidators = function(
|
32204
|
+
this.$$runValidators = function(modelValue, viewValue, doneCallback) {
|
32167
32205
|
currentValidationRunId++;
|
32168
32206
|
var localValidationRunId = currentValidationRunId;
|
32169
32207
|
|
32170
32208
|
// check parser error
|
32171
|
-
if (!processParseErrors(
|
32209
|
+
if (!processParseErrors()) {
|
32172
32210
|
validationDone(false);
|
32173
32211
|
return;
|
32174
32212
|
}
|
@@ -32178,21 +32216,22 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
32178
32216
|
}
|
32179
32217
|
processAsyncValidators();
|
32180
32218
|
|
32181
|
-
function processParseErrors(
|
32219
|
+
function processParseErrors() {
|
32182
32220
|
var errorKey = ctrl.$$parserName || 'parse';
|
32183
|
-
if (
|
32221
|
+
if (parserValid === undefined) {
|
32184
32222
|
setValidity(errorKey, null);
|
32185
32223
|
} else {
|
32186
|
-
|
32187
|
-
if (!parseValid) {
|
32224
|
+
if (!parserValid) {
|
32188
32225
|
forEach(ctrl.$validators, function(v, name) {
|
32189
32226
|
setValidity(name, null);
|
32190
32227
|
});
|
32191
32228
|
forEach(ctrl.$asyncValidators, function(v, name) {
|
32192
32229
|
setValidity(name, null);
|
32193
32230
|
});
|
32194
|
-
return false;
|
32195
32231
|
}
|
32232
|
+
// Set the parse error last, to prevent unsetting it, should a $validators key == parserName
|
32233
|
+
setValidity(errorKey, parserValid);
|
32234
|
+
return parserValid;
|
32196
32235
|
}
|
32197
32236
|
return true;
|
32198
32237
|
}
|
@@ -32287,7 +32326,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
32287
32326
|
this.$$parseAndValidate = function() {
|
32288
32327
|
var viewValue = ctrl.$$lastCommittedViewValue;
|
32289
32328
|
var modelValue = viewValue;
|
32290
|
-
|
32329
|
+
parserValid = isUndefined(modelValue) ? undefined : true;
|
32291
32330
|
|
32292
32331
|
if (parserValid) {
|
32293
32332
|
for (var i = 0; i < ctrl.$parsers.length; i++) {
|
@@ -32313,7 +32352,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
32313
32352
|
|
32314
32353
|
// Pass the $$lastCommittedViewValue here, because the cached viewValue might be out of date.
|
32315
32354
|
// This can happen if e.g. $setViewValue is called from inside a parser
|
32316
|
-
ctrl.$$runValidators(
|
32355
|
+
ctrl.$$runValidators(modelValue, ctrl.$$lastCommittedViewValue, function(allValid) {
|
32317
32356
|
if (!allowInvalid) {
|
32318
32357
|
// Note: Don't check ctrl.$valid here, as we could have
|
32319
32358
|
// external validators (e.g. calculated on the server),
|
@@ -32434,6 +32473,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
32434
32473
|
// TODO(perf): why not move this to the action fn?
|
32435
32474
|
if (modelValue !== ctrl.$modelValue) {
|
32436
32475
|
ctrl.$modelValue = ctrl.$$rawModelValue = modelValue;
|
32476
|
+
parserValid = undefined;
|
32437
32477
|
|
32438
32478
|
var formatters = ctrl.$formatters,
|
32439
32479
|
idx = formatters.length;
|
@@ -32446,7 +32486,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
32446
32486
|
ctrl.$viewValue = ctrl.$$lastCommittedViewValue = viewValue;
|
32447
32487
|
ctrl.$render();
|
32448
32488
|
|
32449
|
-
ctrl.$$runValidators(
|
32489
|
+
ctrl.$$runValidators(modelValue, viewValue, noop);
|
32450
32490
|
}
|
32451
32491
|
}
|
32452
32492
|
|
@@ -33262,6 +33302,55 @@ var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interp
|
|
33262
33302
|
* when keys are deleted and reinstated.
|
33263
33303
|
*
|
33264
33304
|
*
|
33305
|
+
* # Tracking and Duplicates
|
33306
|
+
*
|
33307
|
+
* When the contents of the collection change, `ngRepeat` makes the corresponding changes to the DOM:
|
33308
|
+
*
|
33309
|
+
* * When an item is added, a new instance of the template is added to the DOM.
|
33310
|
+
* * When an item is removed, its template instance is removed from the DOM.
|
33311
|
+
* * When items are reordered, their respective templates are reordered in the DOM.
|
33312
|
+
*
|
33313
|
+
* By default, `ngRepeat` does not allow duplicate items in arrays. This is because when
|
33314
|
+
* there are duplicates, it is not possible to maintain a one-to-one mapping between collection
|
33315
|
+
* items and DOM elements.
|
33316
|
+
*
|
33317
|
+
* If you do need to repeat duplicate items, you can substitute the default tracking behavior
|
33318
|
+
* with your own using the `track by` expression.
|
33319
|
+
*
|
33320
|
+
* For example, you may track items by the index of each item in the collection, using the
|
33321
|
+
* special scope property `$index`:
|
33322
|
+
* ```html
|
33323
|
+
* <div ng-repeat="n in [42, 42, 43, 43] track by $index">
|
33324
|
+
* {{n}}
|
33325
|
+
* </div>
|
33326
|
+
* ```
|
33327
|
+
*
|
33328
|
+
* You may use arbitrary expressions in `track by`, including references to custom functions
|
33329
|
+
* on the scope:
|
33330
|
+
* ```html
|
33331
|
+
* <div ng-repeat="n in [42, 42, 43, 43] track by myTrackingFunction(n)">
|
33332
|
+
* {{n}}
|
33333
|
+
* </div>
|
33334
|
+
* ```
|
33335
|
+
*
|
33336
|
+
* If you are working with objects that have an identifier property, you can track
|
33337
|
+
* by the identifier instead of the whole object. Should you reload your data later, `ngRepeat`
|
33338
|
+
* will not have to rebuild the DOM elements for items it has already rendered, even if the
|
33339
|
+
* JavaScript objects in the collection have been substituted for new ones:
|
33340
|
+
* ```html
|
33341
|
+
* <div ng-repeat="model in collection track by model.id">
|
33342
|
+
* {{model.name}}
|
33343
|
+
* </div>
|
33344
|
+
* ```
|
33345
|
+
*
|
33346
|
+
* When no `track by` expression is provided, it is equivalent to tracking by the built-in
|
33347
|
+
* `$id` function, which tracks items by their identity:
|
33348
|
+
* ```html
|
33349
|
+
* <div ng-repeat="obj in collection track by $id(obj)">
|
33350
|
+
* {{obj.prop}}
|
33351
|
+
* </div>
|
33352
|
+
* ```
|
33353
|
+
*
|
33265
33354
|
* # Special repeat start and end points
|
33266
33355
|
* To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending
|
33267
33356
|
* the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively.
|
@@ -33329,12 +33418,12 @@ var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interp
|
|
33329
33418
|
*
|
33330
33419
|
* For example: `(name, age) in {'adam':10, 'amalie':12}`.
|
33331
33420
|
*
|
33332
|
-
* * `variable in expression track by tracking_expression` – You can also provide an optional tracking
|
33333
|
-
* which can be used to associate the objects in the collection with the DOM elements. If no tracking
|
33334
|
-
* is specified
|
33335
|
-
* more than one tracking
|
33336
|
-
* mapped to the same DOM element, which is not possible.)
|
33337
|
-
* before
|
33421
|
+
* * `variable in expression track by tracking_expression` – You can also provide an optional tracking expression
|
33422
|
+
* which can be used to associate the objects in the collection with the DOM elements. If no tracking expression
|
33423
|
+
* is specified, ng-repeat associates elements by identity. It is an error to have
|
33424
|
+
* more than one tracking expression value resolve to the same key. (This would mean that two distinct objects are
|
33425
|
+
* mapped to the same DOM element, which is not possible.) If filters are used in the expression, they should be
|
33426
|
+
* applied before the tracking expression.
|
33338
33427
|
*
|
33339
33428
|
* For example: `item in items` is equivalent to `item in items track by $id(item)`. This implies that the DOM elements
|
33340
33429
|
* will be associated by item identity in the array.
|
@@ -33718,10 +33807,11 @@ var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';
|
|
33718
33807
|
*
|
33719
33808
|
* By default, the `.ng-hide` class will style the element with `display: none!important`. If you wish to change
|
33720
33809
|
* the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide`
|
33721
|
-
* class
|
33810
|
+
* class CSS. Note that the selector that needs to be used is actually `.ng-hide:not(.ng-hide-animate)` to cope
|
33811
|
+
* with extra animation classes that can be added.
|
33722
33812
|
*
|
33723
33813
|
* ```css
|
33724
|
-
* .ng-hide {
|
33814
|
+
* .ng-hide:not(.ng-hide-animate) {
|
33725
33815
|
* /* this is just another form of hiding an element */
|
33726
33816
|
* display: block!important;
|
33727
33817
|
* position: absolute;
|
@@ -35237,7 +35327,7 @@ var maxlengthDirective = function() {
|
|
35237
35327
|
ctrl.$validate();
|
35238
35328
|
});
|
35239
35329
|
ctrl.$validators.maxlength = function(modelValue, viewValue) {
|
35240
|
-
return (maxlength < 0) || ctrl.$isEmpty(
|
35330
|
+
return (maxlength < 0) || ctrl.$isEmpty(viewValue) || (viewValue.length <= maxlength);
|
35241
35331
|
};
|
35242
35332
|
}
|
35243
35333
|
};
|
@@ -35565,7 +35655,7 @@ _jQuery.fn.bindings = function(windowJquery, bindExp) {
|
|
35565
35655
|
var element = windowJquery(this),
|
35566
35656
|
bindings;
|
35567
35657
|
if (bindings = element.data('$binding')) {
|
35568
|
-
for (var expressions = [], binding, j=0, jj=bindings.length;
|
35658
|
+
for (var expressions = [], binding, j=0, jj=bindings.length; j < jj; j++) {
|
35569
35659
|
binding = bindings[j];
|
35570
35660
|
|
35571
35661
|
if (binding.expressions) {
|
@@ -35641,8 +35731,7 @@ _jQuery.fn.bindings = function(windowJquery, bindExp) {
|
|
35641
35731
|
if (window.WebKitTransitionEvent) {
|
35642
35732
|
evnt = new WebKitTransitionEvent(eventType, eventData);
|
35643
35733
|
evnt.initEvent(eventType, false, true);
|
35644
|
-
}
|
35645
|
-
else {
|
35734
|
+
} else {
|
35646
35735
|
try {
|
35647
35736
|
evnt = new TransitionEvent(eventType, eventData);
|
35648
35737
|
}
|
@@ -35651,13 +35740,11 @@ _jQuery.fn.bindings = function(windowJquery, bindExp) {
|
|
35651
35740
|
evnt.initTransitionEvent(eventType, null, null, null, eventData.elapsedTime || 0);
|
35652
35741
|
}
|
35653
35742
|
}
|
35654
|
-
}
|
35655
|
-
else if (/animationend/.test(eventType)) {
|
35743
|
+
} else if (/animationend/.test(eventType)) {
|
35656
35744
|
if (window.WebKitAnimationEvent) {
|
35657
35745
|
evnt = new WebKitAnimationEvent(eventType, eventData);
|
35658
35746
|
evnt.initEvent(eventType, false, true);
|
35659
|
-
}
|
35660
|
-
else {
|
35747
|
+
} else {
|
35661
35748
|
try {
|
35662
35749
|
evnt = new AnimationEvent(eventType, eventData);
|
35663
35750
|
}
|
@@ -35666,8 +35753,7 @@ _jQuery.fn.bindings = function(windowJquery, bindExp) {
|
|
35666
35753
|
evnt.initAnimationEvent(eventType, null, null, null, eventData.elapsedTime || 0);
|
35667
35754
|
}
|
35668
35755
|
}
|
35669
|
-
}
|
35670
|
-
else {
|
35756
|
+
} else {
|
35671
35757
|
evnt = document.createEvent('MouseEvents');
|
35672
35758
|
x = x || 0;
|
35673
35759
|
y = y || 0;
|
@@ -35772,19 +35858,31 @@ angular.scenario.Application.prototype.navigateTo = function(url, loadFn, errorF
|
|
35772
35858
|
try {
|
35773
35859
|
var $window = self.getWindow_();
|
35774
35860
|
|
35775
|
-
if (
|
35776
|
-
|
35777
|
-
|
35778
|
-
|
35779
|
-
|
35780
|
-
|
35781
|
-
|
35861
|
+
if (!$window.angular) {
|
35862
|
+
self.executeAction(loadFn);
|
35863
|
+
return;
|
35864
|
+
}
|
35865
|
+
|
35866
|
+
if (!$window.angular.resumeBootstrap) {
|
35867
|
+
$window.angular.resumeDeferredBootstrap = resumeDeferredBootstrap;
|
35868
|
+
} else {
|
35869
|
+
resumeDeferredBootstrap();
|
35782
35870
|
}
|
35783
35871
|
|
35784
|
-
self.executeAction(loadFn);
|
35785
35872
|
} catch (e) {
|
35786
35873
|
errorFn(e);
|
35787
35874
|
}
|
35875
|
+
|
35876
|
+
function resumeDeferredBootstrap() {
|
35877
|
+
// Disable animations
|
35878
|
+
var $injector = $window.angular.resumeBootstrap([['$provide', function($provide) {
|
35879
|
+
return ['$animate', function($animate) {
|
35880
|
+
$animate.enabled(false);
|
35881
|
+
}];
|
35882
|
+
}]]);
|
35883
|
+
self.rootElement = $injector.get('$rootElement')[0];
|
35884
|
+
self.executeAction(loadFn);
|
35885
|
+
}
|
35788
35886
|
}).attr('src', url);
|
35789
35887
|
|
35790
35888
|
// for IE compatibility set the name *after* setting the frame url
|
@@ -35809,7 +35907,14 @@ angular.scenario.Application.prototype.executeAction = function(action) {
|
|
35809
35907
|
if (!$window.angular) {
|
35810
35908
|
return action.call(this, $window, _jQuery($window.document));
|
35811
35909
|
}
|
35812
|
-
|
35910
|
+
|
35911
|
+
if (!!this.rootElement) {
|
35912
|
+
executeWithElement(this.rootElement);
|
35913
|
+
} else {
|
35914
|
+
angularInit($window.document, angular.bind(this, executeWithElement));
|
35915
|
+
}
|
35916
|
+
|
35917
|
+
function executeWithElement(element) {
|
35813
35918
|
var $injector = $window.angular.element(element).injector();
|
35814
35919
|
var $element = _jQuery(element);
|
35815
35920
|
|
@@ -35822,7 +35927,7 @@ angular.scenario.Application.prototype.executeAction = function(action) {
|
|
35822
35927
|
action.call(self, $window, $element);
|
35823
35928
|
});
|
35824
35929
|
});
|
35825
|
-
}
|
35930
|
+
}
|
35826
35931
|
};
|
35827
35932
|
|
35828
35933
|
/**
|