angularjs-rails 1.3.10 → 1.3.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. checksums.yaml +4 -4
  2. data/lib/angularjs-rails/version.rb +2 -2
  3. data/vendor/assets/javascripts/angular-animate.js +2 -3
  4. data/vendor/assets/javascripts/angular-aria.js +16 -6
  5. data/vendor/assets/javascripts/angular-cookies.js +1 -1
  6. data/vendor/assets/javascripts/angular-loader.js +2 -2
  7. data/vendor/assets/javascripts/angular-messages.js +1 -1
  8. data/vendor/assets/javascripts/angular-mocks.js +15 -1
  9. data/vendor/assets/javascripts/angular-resource.js +2 -1
  10. data/vendor/assets/javascripts/angular-route.js +5 -11
  11. data/vendor/assets/javascripts/angular-sanitize.js +15 -27
  12. data/vendor/assets/javascripts/angular-scenario.js +243 -138
  13. data/vendor/assets/javascripts/angular-touch.js +1 -1
  14. data/vendor/assets/javascripts/angular.js +209 -119
  15. data/vendor/assets/javascripts/unstable/angular-animate.js +2 -3
  16. data/vendor/assets/javascripts/unstable/angular-aria.js +16 -6
  17. data/vendor/assets/javascripts/unstable/angular-cookies.js +1 -1
  18. data/vendor/assets/javascripts/unstable/angular-loader.js +2 -2
  19. data/vendor/assets/javascripts/unstable/angular-messages.js +1 -1
  20. data/vendor/assets/javascripts/unstable/angular-mocks.js +15 -1
  21. data/vendor/assets/javascripts/unstable/angular-resource.js +2 -1
  22. data/vendor/assets/javascripts/unstable/angular-route.js +5 -11
  23. data/vendor/assets/javascripts/unstable/angular-sanitize.js +15 -27
  24. data/vendor/assets/javascripts/unstable/angular-scenario.js +243 -138
  25. data/vendor/assets/javascripts/unstable/angular-touch.js +1 -1
  26. data/vendor/assets/javascripts/unstable/angular.js +209 -119
  27. metadata +2 -2
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.10
2
+ * @license AngularJS v1.3.14
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.3.10
2
+ * @license AngularJS v1.3.14
3
3
  * (c) 2010-2014 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -54,7 +54,7 @@ function minErr(module, ErrorConstructor) {
54
54
  return match;
55
55
  });
56
56
 
57
- message = message + '\nhttp://errors.angularjs.org/1.3.10/' +
57
+ message = message + '\nhttp://errors.angularjs.org/1.3.14/' +
58
58
  (module ? module + '/' : '') + code;
59
59
  for (i = 2; i < arguments.length; i++) {
60
60
  message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
@@ -381,8 +381,7 @@ function nextUid() {
381
381
  function setHashKey(obj, h) {
382
382
  if (h) {
383
383
  obj.$$hashKey = h;
384
- }
385
- else {
384
+ } else {
386
385
  delete obj.$$hashKey;
387
386
  }
388
387
  }
@@ -691,7 +690,7 @@ function isElement(node) {
691
690
  function makeMap(str) {
692
691
  var obj = {}, items = str.split(","), i;
693
692
  for (i = 0; i < items.length; i++)
694
- obj[ items[i] ] = true;
693
+ obj[items[i]] = true;
695
694
  return obj;
696
695
  }
697
696
 
@@ -1472,8 +1471,12 @@ function bootstrap(element, modules, config) {
1472
1471
  forEach(extraModules, function(module) {
1473
1472
  modules.push(module);
1474
1473
  });
1475
- doBootstrap();
1474
+ return doBootstrap();
1476
1475
  };
1476
+
1477
+ if (isFunction(angular.resumeDeferredBootstrap)) {
1478
+ angular.resumeDeferredBootstrap();
1479
+ }
1477
1480
  }
1478
1481
 
1479
1482
  /**
@@ -2118,11 +2121,11 @@ function toDebugString(obj) {
2118
2121
  * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
2119
2122
  */
2120
2123
  var version = {
2121
- full: '1.3.10', // all of these placeholder strings will be replaced by grunt's
2124
+ full: '1.3.14', // all of these placeholder strings will be replaced by grunt's
2122
2125
  major: 1, // package task
2123
2126
  minor: 3,
2124
- dot: 10,
2125
- codeName: 'heliotropic-sundial'
2127
+ dot: 14,
2128
+ codeName: 'instantaneous-browserification'
2126
2129
  };
2127
2130
 
2128
2131
 
@@ -4157,7 +4160,7 @@ function createInjector(modulesToLoad, strictDi) {
4157
4160
  }
4158
4161
 
4159
4162
  var args = [],
4160
- $inject = annotate(fn, strictDi, serviceName),
4163
+ $inject = createInjector.$$annotate(fn, strictDi, serviceName),
4161
4164
  length, i,
4162
4165
  key;
4163
4166
 
@@ -4196,7 +4199,7 @@ function createInjector(modulesToLoad, strictDi) {
4196
4199
  invoke: invoke,
4197
4200
  instantiate: instantiate,
4198
4201
  get: getService,
4199
- annotate: annotate,
4202
+ annotate: createInjector.$$annotate,
4200
4203
  has: function(name) {
4201
4204
  return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name);
4202
4205
  }
@@ -7870,8 +7873,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
7870
7873
  afterTemplateChildLinkFn,
7871
7874
  beforeTemplateCompileNode = $compileNode[0],
7872
7875
  origAsyncDirective = directives.shift(),
7873
- // The fact that we have to copy and patch the directive seems wrong!
7874
- derivedSyncDirective = extend({}, origAsyncDirective, {
7876
+ derivedSyncDirective = inherit(origAsyncDirective, {
7875
7877
  templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective
7876
7878
  }),
7877
7879
  templateUrl = (isFunction(origAsyncDirective.templateUrl))
@@ -8324,6 +8326,8 @@ function removeComments(jqNodes) {
8324
8326
  return jqNodes;
8325
8327
  }
8326
8328
 
8329
+ var $controllerMinErr = minErr('$controller');
8330
+
8327
8331
  /**
8328
8332
  * @ngdoc provider
8329
8333
  * @name $controllerProvider
@@ -8411,7 +8415,12 @@ function $ControllerProvider() {
8411
8415
  }
8412
8416
 
8413
8417
  if (isString(expression)) {
8414
- match = expression.match(CNTRL_REG),
8418
+ match = expression.match(CNTRL_REG);
8419
+ if (!match) {
8420
+ throw $controllerMinErr('ctrlfmt',
8421
+ "Badly formed controller string '{0}'. " +
8422
+ "Must match `__name__ as __id__` or `__name__`.", expression);
8423
+ }
8415
8424
  constructor = match[1],
8416
8425
  identifier = identifier || match[3];
8417
8426
  expression = controllers.hasOwnProperty(constructor)
@@ -11320,7 +11329,7 @@ function $LocationProvider() {
11320
11329
  // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser)
11321
11330
  // currently we open nice url link and redirect then
11322
11331
 
11323
- if (!html5Mode.rewriteLinks || event.ctrlKey || event.metaKey || event.which == 2) return;
11332
+ if (!html5Mode.rewriteLinks || event.ctrlKey || event.metaKey || event.shiftKey || event.which == 2 || event.button == 2) return;
11324
11333
 
11325
11334
  var elm = jqLite(event.target);
11326
11335
 
@@ -11362,7 +11371,7 @@ function $LocationProvider() {
11362
11371
 
11363
11372
 
11364
11373
  // rewrite hashbang url <> html5 url
11365
- if ($location.absUrl() != initialUrl) {
11374
+ if (trimEmptyHash($location.absUrl()) != trimEmptyHash(initialUrl)) {
11366
11375
  $browser.url($location.absUrl(), true);
11367
11376
  }
11368
11377
 
@@ -12336,6 +12345,11 @@ Parser.prototype = {
12336
12345
  ? fn.apply(context, args)
12337
12346
  : fn(args[0], args[1], args[2], args[3], args[4]);
12338
12347
 
12348
+ if (args) {
12349
+ // Free-up the memory (arguments of the last function call).
12350
+ args.length = 0;
12351
+ }
12352
+
12339
12353
  return ensureSafeObject(v, expressionText);
12340
12354
  };
12341
12355
  },
@@ -13207,8 +13221,7 @@ function qFactory(nextTick, exceptionHandler) {
13207
13221
  'qcycle',
13208
13222
  "Expected promise to be resolved with value other than itself '{0}'",
13209
13223
  val));
13210
- }
13211
- else {
13224
+ } else {
13212
13225
  this.$$resolve(val);
13213
13226
  }
13214
13227
 
@@ -17665,6 +17678,9 @@ var htmlAnchorDirective = valueFn({
17665
17678
  compile: function(element, attr) {
17666
17679
  if (!attr.href && !attr.xlinkHref && !attr.name) {
17667
17680
  return function(scope, element) {
17681
+ // If the linked element is not an anchor tag anymore, do nothing
17682
+ if (element[0].nodeName.toLowerCase() !== 'a') return;
17683
+
17668
17684
  // SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute.
17669
17685
  var href = toString.call(element.prop('href')) === '[object SVGAnimatedString]' ?
17670
17686
  'xlink:href' : 'href';
@@ -17838,20 +17854,23 @@ var htmlAnchorDirective = valueFn({
17838
17854
  *
17839
17855
  * @description
17840
17856
  *
17841
- * We shouldn't do this, because it will make the button enabled on Chrome/Firefox but not on IE8 and older IEs:
17857
+ * This directive sets the `disabled` attribute on the element if the
17858
+ * {@link guide/expression expression} inside `ngDisabled` evaluates to truthy.
17859
+ *
17860
+ * A special directive is necessary because we cannot use interpolation inside the `disabled`
17861
+ * attribute. The following example would make the button enabled on Chrome/Firefox
17862
+ * but not on older IEs:
17863
+ *
17842
17864
  * ```html
17843
- * <div ng-init="scope = { isDisabled: false }">
17844
- * <button disabled="{{scope.isDisabled}}">Disabled</button>
17865
+ * <div ng-init="isDisabled = false">
17866
+ * <button disabled="{{isDisabled}}">Disabled</button>
17845
17867
  * </div>
17846
17868
  * ```
17847
17869
  *
17848
- * The HTML specification does not require browsers to preserve the values of boolean attributes
17849
- * such as disabled. (Their presence means true and their absence means false.)
17870
+ * This is because the HTML specification does not require browsers to preserve the values of
17871
+ * boolean attributes such as `disabled` (Their presence means true and their absence means false.)
17850
17872
  * If we put an Angular interpolation expression into such an attribute then the
17851
17873
  * binding information would be lost when the browser removes the attribute.
17852
- * The `ngDisabled` directive solves this problem for the `disabled` attribute.
17853
- * This complementary directive is not removed by the browser and so provides
17854
- * a permanent reliable place to store the binding information.
17855
17874
  *
17856
17875
  * @example
17857
17876
  <example>
@@ -17870,7 +17889,7 @@ var htmlAnchorDirective = valueFn({
17870
17889
  *
17871
17890
  * @element INPUT
17872
17891
  * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy,
17873
- * then special attribute "disabled" will be set on the element
17892
+ * then the `disabled` attribute will be set on the element
17874
17893
  */
17875
17894
 
17876
17895
 
@@ -18683,19 +18702,21 @@ var inputType = {
18683
18702
  <script>
18684
18703
  angular.module('textInputExample', [])
18685
18704
  .controller('ExampleController', ['$scope', function($scope) {
18686
- $scope.text = 'guest';
18687
- $scope.word = /^\s*\w*\s*$/;
18705
+ $scope.example = {
18706
+ text: 'guest',
18707
+ word: /^\s*\w*\s*$/
18708
+ };
18688
18709
  }]);
18689
18710
  </script>
18690
18711
  <form name="myForm" ng-controller="ExampleController">
18691
- Single word: <input type="text" name="input" ng-model="text"
18692
- ng-pattern="word" required ng-trim="false">
18712
+ Single word: <input type="text" name="input" ng-model="example.text"
18713
+ ng-pattern="example.word" required ng-trim="false">
18693
18714
  <span class="error" ng-show="myForm.input.$error.required">
18694
18715
  Required!</span>
18695
18716
  <span class="error" ng-show="myForm.input.$error.pattern">
18696
18717
  Single word only!</span>
18697
18718
 
18698
- <tt>text = {{text}}</tt><br/>
18719
+ <tt>text = {{example.text}}</tt><br/>
18699
18720
  <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
18700
18721
  <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
18701
18722
  <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
@@ -18703,9 +18724,9 @@ var inputType = {
18703
18724
  </form>
18704
18725
  </file>
18705
18726
  <file name="protractor.js" type="protractor">
18706
- var text = element(by.binding('text'));
18727
+ var text = element(by.binding('example.text'));
18707
18728
  var valid = element(by.binding('myForm.input.$valid'));
18708
- var input = element(by.model('text'));
18729
+ var input = element(by.model('example.text'));
18709
18730
 
18710
18731
  it('should initialize to model', function() {
18711
18732
  expect(text.getText()).toContain('guest');
@@ -18767,18 +18788,20 @@ var inputType = {
18767
18788
  <script>
18768
18789
  angular.module('dateInputExample', [])
18769
18790
  .controller('DateController', ['$scope', function($scope) {
18770
- $scope.value = new Date(2013, 9, 22);
18791
+ $scope.example = {
18792
+ value: new Date(2013, 9, 22)
18793
+ };
18771
18794
  }]);
18772
18795
  </script>
18773
18796
  <form name="myForm" ng-controller="DateController as dateCtrl">
18774
18797
  Pick a date in 2013:
18775
- <input type="date" id="exampleInput" name="input" ng-model="value"
18798
+ <input type="date" id="exampleInput" name="input" ng-model="example.value"
18776
18799
  placeholder="yyyy-MM-dd" min="2013-01-01" max="2013-12-31" required />
18777
18800
  <span class="error" ng-show="myForm.input.$error.required">
18778
18801
  Required!</span>
18779
18802
  <span class="error" ng-show="myForm.input.$error.date">
18780
18803
  Not a valid date!</span>
18781
- <tt>value = {{value | date: "yyyy-MM-dd"}}</tt><br/>
18804
+ <tt>value = {{example.value | date: "yyyy-MM-dd"}}</tt><br/>
18782
18805
  <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
18783
18806
  <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
18784
18807
  <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
@@ -18786,9 +18809,9 @@ var inputType = {
18786
18809
  </form>
18787
18810
  </file>
18788
18811
  <file name="protractor.js" type="protractor">
18789
- var value = element(by.binding('value | date: "yyyy-MM-dd"'));
18812
+ var value = element(by.binding('example.value | date: "yyyy-MM-dd"'));
18790
18813
  var valid = element(by.binding('myForm.input.$valid'));
18791
- var input = element(by.model('value'));
18814
+ var input = element(by.model('example.value'));
18792
18815
 
18793
18816
  // currently protractor/webdriver does not support
18794
18817
  // sending keys to all known HTML5 input controls
@@ -18858,18 +18881,20 @@ var inputType = {
18858
18881
  <script>
18859
18882
  angular.module('dateExample', [])
18860
18883
  .controller('DateController', ['$scope', function($scope) {
18861
- $scope.value = new Date(2010, 11, 28, 14, 57);
18884
+ $scope.example = {
18885
+ value: new Date(2010, 11, 28, 14, 57)
18886
+ };
18862
18887
  }]);
18863
18888
  </script>
18864
18889
  <form name="myForm" ng-controller="DateController as dateCtrl">
18865
18890
  Pick a date between in 2013:
18866
- <input type="datetime-local" id="exampleInput" name="input" ng-model="value"
18891
+ <input type="datetime-local" id="exampleInput" name="input" ng-model="example.value"
18867
18892
  placeholder="yyyy-MM-ddTHH:mm:ss" min="2001-01-01T00:00:00" max="2013-12-31T00:00:00" required />
18868
18893
  <span class="error" ng-show="myForm.input.$error.required">
18869
18894
  Required!</span>
18870
18895
  <span class="error" ng-show="myForm.input.$error.datetimelocal">
18871
18896
  Not a valid date!</span>
18872
- <tt>value = {{value | date: "yyyy-MM-ddTHH:mm:ss"}}</tt><br/>
18897
+ <tt>value = {{example.value | date: "yyyy-MM-ddTHH:mm:ss"}}</tt><br/>
18873
18898
  <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
18874
18899
  <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
18875
18900
  <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
@@ -18877,9 +18902,9 @@ var inputType = {
18877
18902
  </form>
18878
18903
  </file>
18879
18904
  <file name="protractor.js" type="protractor">
18880
- var value = element(by.binding('value | date: "yyyy-MM-ddTHH:mm:ss"'));
18905
+ var value = element(by.binding('example.value | date: "yyyy-MM-ddTHH:mm:ss"'));
18881
18906
  var valid = element(by.binding('myForm.input.$valid'));
18882
- var input = element(by.model('value'));
18907
+ var input = element(by.model('example.value'));
18883
18908
 
18884
18909
  // currently protractor/webdriver does not support
18885
18910
  // sending keys to all known HTML5 input controls
@@ -18950,18 +18975,20 @@ var inputType = {
18950
18975
  <script>
18951
18976
  angular.module('timeExample', [])
18952
18977
  .controller('DateController', ['$scope', function($scope) {
18953
- $scope.value = new Date(1970, 0, 1, 14, 57, 0);
18978
+ $scope.example = {
18979
+ value: new Date(1970, 0, 1, 14, 57, 0)
18980
+ };
18954
18981
  }]);
18955
18982
  </script>
18956
18983
  <form name="myForm" ng-controller="DateController as dateCtrl">
18957
18984
  Pick a between 8am and 5pm:
18958
- <input type="time" id="exampleInput" name="input" ng-model="value"
18985
+ <input type="time" id="exampleInput" name="input" ng-model="example.value"
18959
18986
  placeholder="HH:mm:ss" min="08:00:00" max="17:00:00" required />
18960
18987
  <span class="error" ng-show="myForm.input.$error.required">
18961
18988
  Required!</span>
18962
18989
  <span class="error" ng-show="myForm.input.$error.time">
18963
18990
  Not a valid date!</span>
18964
- <tt>value = {{value | date: "HH:mm:ss"}}</tt><br/>
18991
+ <tt>value = {{example.value | date: "HH:mm:ss"}}</tt><br/>
18965
18992
  <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
18966
18993
  <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
18967
18994
  <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
@@ -18969,9 +18996,9 @@ var inputType = {
18969
18996
  </form>
18970
18997
  </file>
18971
18998
  <file name="protractor.js" type="protractor">
18972
- var value = element(by.binding('value | date: "HH:mm:ss"'));
18999
+ var value = element(by.binding('example.value | date: "HH:mm:ss"'));
18973
19000
  var valid = element(by.binding('myForm.input.$valid'));
18974
- var input = element(by.model('value'));
19001
+ var input = element(by.model('example.value'));
18975
19002
 
18976
19003
  // currently protractor/webdriver does not support
18977
19004
  // sending keys to all known HTML5 input controls
@@ -19041,18 +19068,20 @@ var inputType = {
19041
19068
  <script>
19042
19069
  angular.module('weekExample', [])
19043
19070
  .controller('DateController', ['$scope', function($scope) {
19044
- $scope.value = new Date(2013, 0, 3);
19071
+ $scope.example = {
19072
+ value: new Date(2013, 0, 3)
19073
+ };
19045
19074
  }]);
19046
19075
  </script>
19047
19076
  <form name="myForm" ng-controller="DateController as dateCtrl">
19048
19077
  Pick a date between in 2013:
19049
- <input id="exampleInput" type="week" name="input" ng-model="value"
19078
+ <input id="exampleInput" type="week" name="input" ng-model="example.value"
19050
19079
  placeholder="YYYY-W##" min="2012-W32" max="2013-W52" required />
19051
19080
  <span class="error" ng-show="myForm.input.$error.required">
19052
19081
  Required!</span>
19053
19082
  <span class="error" ng-show="myForm.input.$error.week">
19054
19083
  Not a valid date!</span>
19055
- <tt>value = {{value | date: "yyyy-Www"}}</tt><br/>
19084
+ <tt>value = {{example.value | date: "yyyy-Www"}}</tt><br/>
19056
19085
  <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
19057
19086
  <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
19058
19087
  <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
@@ -19060,9 +19089,9 @@ var inputType = {
19060
19089
  </form>
19061
19090
  </file>
19062
19091
  <file name="protractor.js" type="protractor">
19063
- var value = element(by.binding('value | date: "yyyy-Www"'));
19092
+ var value = element(by.binding('example.value | date: "yyyy-Www"'));
19064
19093
  var valid = element(by.binding('myForm.input.$valid'));
19065
- var input = element(by.model('value'));
19094
+ var input = element(by.model('example.value'));
19066
19095
 
19067
19096
  // currently protractor/webdriver does not support
19068
19097
  // sending keys to all known HTML5 input controls
@@ -19132,18 +19161,20 @@ var inputType = {
19132
19161
  <script>
19133
19162
  angular.module('monthExample', [])
19134
19163
  .controller('DateController', ['$scope', function($scope) {
19135
- $scope.value = new Date(2013, 9, 1);
19164
+ $scope.example = {
19165
+ value: new Date(2013, 9, 1)
19166
+ };
19136
19167
  }]);
19137
19168
  </script>
19138
19169
  <form name="myForm" ng-controller="DateController as dateCtrl">
19139
- Pick a month int 2013:
19140
- <input id="exampleInput" type="month" name="input" ng-model="value"
19170
+ Pick a month in 2013:
19171
+ <input id="exampleInput" type="month" name="input" ng-model="example.value"
19141
19172
  placeholder="yyyy-MM" min="2013-01" max="2013-12" required />
19142
19173
  <span class="error" ng-show="myForm.input.$error.required">
19143
19174
  Required!</span>
19144
19175
  <span class="error" ng-show="myForm.input.$error.month">
19145
19176
  Not a valid month!</span>
19146
- <tt>value = {{value | date: "yyyy-MM"}}</tt><br/>
19177
+ <tt>value = {{example.value | date: "yyyy-MM"}}</tt><br/>
19147
19178
  <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
19148
19179
  <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
19149
19180
  <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
@@ -19151,9 +19182,9 @@ var inputType = {
19151
19182
  </form>
19152
19183
  </file>
19153
19184
  <file name="protractor.js" type="protractor">
19154
- var value = element(by.binding('value | date: "yyyy-MM"'));
19185
+ var value = element(by.binding('example.value | date: "yyyy-MM"'));
19155
19186
  var valid = element(by.binding('myForm.input.$valid'));
19156
- var input = element(by.model('value'));
19187
+ var input = element(by.model('example.value'));
19157
19188
 
19158
19189
  // currently protractor/webdriver does not support
19159
19190
  // sending keys to all known HTML5 input controls
@@ -19229,17 +19260,19 @@ var inputType = {
19229
19260
  <script>
19230
19261
  angular.module('numberExample', [])
19231
19262
  .controller('ExampleController', ['$scope', function($scope) {
19232
- $scope.value = 12;
19263
+ $scope.example = {
19264
+ value: 12
19265
+ };
19233
19266
  }]);
19234
19267
  </script>
19235
19268
  <form name="myForm" ng-controller="ExampleController">
19236
- Number: <input type="number" name="input" ng-model="value"
19269
+ Number: <input type="number" name="input" ng-model="example.value"
19237
19270
  min="0" max="99" required>
19238
19271
  <span class="error" ng-show="myForm.input.$error.required">
19239
19272
  Required!</span>
19240
19273
  <span class="error" ng-show="myForm.input.$error.number">
19241
19274
  Not valid number!</span>
19242
- <tt>value = {{value}}</tt><br/>
19275
+ <tt>value = {{example.value}}</tt><br/>
19243
19276
  <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
19244
19277
  <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
19245
19278
  <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
@@ -19247,9 +19280,9 @@ var inputType = {
19247
19280
  </form>
19248
19281
  </file>
19249
19282
  <file name="protractor.js" type="protractor">
19250
- var value = element(by.binding('value'));
19283
+ var value = element(by.binding('example.value'));
19251
19284
  var valid = element(by.binding('myForm.input.$valid'));
19252
- var input = element(by.model('value'));
19285
+ var input = element(by.model('example.value'));
19253
19286
 
19254
19287
  it('should initialize to model', function() {
19255
19288
  expect(value.getText()).toContain('12');
@@ -19317,16 +19350,18 @@ var inputType = {
19317
19350
  <script>
19318
19351
  angular.module('urlExample', [])
19319
19352
  .controller('ExampleController', ['$scope', function($scope) {
19320
- $scope.text = 'http://google.com';
19353
+ $scope.url = {
19354
+ text: 'http://google.com'
19355
+ };
19321
19356
  }]);
19322
19357
  </script>
19323
19358
  <form name="myForm" ng-controller="ExampleController">
19324
- URL: <input type="url" name="input" ng-model="text" required>
19359
+ URL: <input type="url" name="input" ng-model="url.text" required>
19325
19360
  <span class="error" ng-show="myForm.input.$error.required">
19326
19361
  Required!</span>
19327
19362
  <span class="error" ng-show="myForm.input.$error.url">
19328
19363
  Not valid url!</span>
19329
- <tt>text = {{text}}</tt><br/>
19364
+ <tt>text = {{url.text}}</tt><br/>
19330
19365
  <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
19331
19366
  <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
19332
19367
  <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
@@ -19335,9 +19370,9 @@ var inputType = {
19335
19370
  </form>
19336
19371
  </file>
19337
19372
  <file name="protractor.js" type="protractor">
19338
- var text = element(by.binding('text'));
19373
+ var text = element(by.binding('url.text'));
19339
19374
  var valid = element(by.binding('myForm.input.$valid'));
19340
- var input = element(by.model('text'));
19375
+ var input = element(by.model('url.text'));
19341
19376
 
19342
19377
  it('should initialize to model', function() {
19343
19378
  expect(text.getText()).toContain('http://google.com');
@@ -19406,16 +19441,18 @@ var inputType = {
19406
19441
  <script>
19407
19442
  angular.module('emailExample', [])
19408
19443
  .controller('ExampleController', ['$scope', function($scope) {
19409
- $scope.text = 'me@example.com';
19444
+ $scope.email = {
19445
+ text: 'me@example.com'
19446
+ };
19410
19447
  }]);
19411
19448
  </script>
19412
19449
  <form name="myForm" ng-controller="ExampleController">
19413
- Email: <input type="email" name="input" ng-model="text" required>
19450
+ Email: <input type="email" name="input" ng-model="email.text" required>
19414
19451
  <span class="error" ng-show="myForm.input.$error.required">
19415
19452
  Required!</span>
19416
19453
  <span class="error" ng-show="myForm.input.$error.email">
19417
19454
  Not valid email!</span>
19418
- <tt>text = {{text}}</tt><br/>
19455
+ <tt>text = {{email.text}}</tt><br/>
19419
19456
  <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
19420
19457
  <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
19421
19458
  <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
@@ -19424,9 +19461,9 @@ var inputType = {
19424
19461
  </form>
19425
19462
  </file>
19426
19463
  <file name="protractor.js" type="protractor">
19427
- var text = element(by.binding('text'));
19464
+ var text = element(by.binding('email.text'));
19428
19465
  var valid = element(by.binding('myForm.input.$valid'));
19429
- var input = element(by.model('text'));
19466
+ var input = element(by.model('email.text'));
19430
19467
 
19431
19468
  it('should initialize to model', function() {
19432
19469
  expect(text.getText()).toContain('me@example.com');
@@ -19473,7 +19510,9 @@ var inputType = {
19473
19510
  <script>
19474
19511
  angular.module('radioExample', [])
19475
19512
  .controller('ExampleController', ['$scope', function($scope) {
19476
- $scope.color = 'blue';
19513
+ $scope.color = {
19514
+ name: 'blue'
19515
+ };
19477
19516
  $scope.specialValue = {
19478
19517
  "id": "12345",
19479
19518
  "value": "green"
@@ -19481,20 +19520,20 @@ var inputType = {
19481
19520
  }]);
19482
19521
  </script>
19483
19522
  <form name="myForm" ng-controller="ExampleController">
19484
- <input type="radio" ng-model="color" value="red"> Red <br/>
19485
- <input type="radio" ng-model="color" ng-value="specialValue"> Green <br/>
19486
- <input type="radio" ng-model="color" value="blue"> Blue <br/>
19487
- <tt>color = {{color | json}}</tt><br/>
19523
+ <input type="radio" ng-model="color.name" value="red"> Red <br/>
19524
+ <input type="radio" ng-model="color.name" ng-value="specialValue"> Green <br/>
19525
+ <input type="radio" ng-model="color.name" value="blue"> Blue <br/>
19526
+ <tt>color = {{color.name | json}}</tt><br/>
19488
19527
  </form>
19489
19528
  Note that `ng-value="specialValue"` sets radio item's value to be the value of `$scope.specialValue`.
19490
19529
  </file>
19491
19530
  <file name="protractor.js" type="protractor">
19492
19531
  it('should change state', function() {
19493
- var color = element(by.binding('color'));
19532
+ var color = element(by.binding('color.name'));
19494
19533
 
19495
19534
  expect(color.getText()).toContain('blue');
19496
19535
 
19497
- element.all(by.model('color')).get(0).click();
19536
+ element.all(by.model('color.name')).get(0).click();
19498
19537
 
19499
19538
  expect(color.getText()).toContain('red');
19500
19539
  });
@@ -19524,28 +19563,30 @@ var inputType = {
19524
19563
  <script>
19525
19564
  angular.module('checkboxExample', [])
19526
19565
  .controller('ExampleController', ['$scope', function($scope) {
19527
- $scope.value1 = true;
19528
- $scope.value2 = 'YES'
19566
+ $scope.checkboxModel = {
19567
+ value1 : true,
19568
+ value2 : 'YES'
19569
+ };
19529
19570
  }]);
19530
19571
  </script>
19531
19572
  <form name="myForm" ng-controller="ExampleController">
19532
- Value1: <input type="checkbox" ng-model="value1"> <br/>
19533
- Value2: <input type="checkbox" ng-model="value2"
19573
+ Value1: <input type="checkbox" ng-model="checkboxModel.value1"> <br/>
19574
+ Value2: <input type="checkbox" ng-model="checkboxModel.value2"
19534
19575
  ng-true-value="'YES'" ng-false-value="'NO'"> <br/>
19535
- <tt>value1 = {{value1}}</tt><br/>
19536
- <tt>value2 = {{value2}}</tt><br/>
19576
+ <tt>value1 = {{checkboxModel.value1}}</tt><br/>
19577
+ <tt>value2 = {{checkboxModel.value2}}</tt><br/>
19537
19578
  </form>
19538
19579
  </file>
19539
19580
  <file name="protractor.js" type="protractor">
19540
19581
  it('should change state', function() {
19541
- var value1 = element(by.binding('value1'));
19542
- var value2 = element(by.binding('value2'));
19582
+ var value1 = element(by.binding('checkboxModel.value1'));
19583
+ var value2 = element(by.binding('checkboxModel.value2'));
19543
19584
 
19544
19585
  expect(value1.getText()).toContain('true');
19545
19586
  expect(value2.getText()).toContain('YES');
19546
19587
 
19547
- element(by.model('value1')).click();
19548
- element(by.model('value2')).click();
19588
+ element(by.model('checkboxModel.value1')).click();
19589
+ element(by.model('checkboxModel.value2')).click();
19549
19590
 
19550
19591
  expect(value1.getText()).toContain('false');
19551
19592
  expect(value2.getText()).toContain('NO');
@@ -19850,7 +19891,7 @@ function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
19850
19891
  return value;
19851
19892
  });
19852
19893
 
19853
- if (attr.min || attr.ngMin) {
19894
+ if (isDefined(attr.min) || attr.ngMin) {
19854
19895
  var minVal;
19855
19896
  ctrl.$validators.min = function(value) {
19856
19897
  return ctrl.$isEmpty(value) || isUndefined(minVal) || value >= minVal;
@@ -19866,7 +19907,7 @@ function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
19866
19907
  });
19867
19908
  }
19868
19909
 
19869
- if (attr.max || attr.ngMax) {
19910
+ if (isDefined(attr.max) || attr.ngMax) {
19870
19911
  var maxVal;
19871
19912
  ctrl.$validators.max = function(value) {
19872
19913
  return ctrl.$isEmpty(value) || isUndefined(maxVal) || value <= maxVal;
@@ -22254,7 +22295,7 @@ var ngIncludeFillContentDirective = ['$compile',
22254
22295
  * **Note**: If you have assignment in `ngInit` along with {@link ng.$filter `$filter`}, make
22255
22296
  * sure you have parenthesis for correct precedence:
22256
22297
  * <pre class="prettyprint">
22257
- * <div ng-init="test1 = (data | orderBy:'name')"></div>
22298
+ * `<div ng-init="test1 = (data | orderBy:'name')"></div>`
22258
22299
  * </pre>
22259
22300
  * </div>
22260
22301
  *
@@ -22672,6 +22713,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
22672
22713
  ngModelGet = parsedNgModel,
22673
22714
  ngModelSet = parsedNgModelAssign,
22674
22715
  pendingDebounce = null,
22716
+ parserValid,
22675
22717
  ctrl = this;
22676
22718
 
22677
22719
  this.$$setOptions = function(options) {
@@ -22944,16 +22986,12 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
22944
22986
  // the model although neither viewValue nor the model on the scope changed
22945
22987
  var modelValue = ctrl.$$rawModelValue;
22946
22988
 
22947
- // Check if the there's a parse error, so we don't unset it accidentially
22948
- var parserName = ctrl.$$parserName || 'parse';
22949
- var parserValid = ctrl.$error[parserName] ? false : undefined;
22950
-
22951
22989
  var prevValid = ctrl.$valid;
22952
22990
  var prevModelValue = ctrl.$modelValue;
22953
22991
 
22954
22992
  var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid;
22955
22993
 
22956
- ctrl.$$runValidators(parserValid, modelValue, viewValue, function(allValid) {
22994
+ ctrl.$$runValidators(modelValue, viewValue, function(allValid) {
22957
22995
  // If there was no change in validity, don't update the model
22958
22996
  // This prevents changing an invalid modelValue to undefined
22959
22997
  if (!allowInvalid && prevValid !== allValid) {
@@ -22971,12 +23009,12 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
22971
23009
 
22972
23010
  };
22973
23011
 
22974
- this.$$runValidators = function(parseValid, modelValue, viewValue, doneCallback) {
23012
+ this.$$runValidators = function(modelValue, viewValue, doneCallback) {
22975
23013
  currentValidationRunId++;
22976
23014
  var localValidationRunId = currentValidationRunId;
22977
23015
 
22978
23016
  // check parser error
22979
- if (!processParseErrors(parseValid)) {
23017
+ if (!processParseErrors()) {
22980
23018
  validationDone(false);
22981
23019
  return;
22982
23020
  }
@@ -22986,21 +23024,22 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
22986
23024
  }
22987
23025
  processAsyncValidators();
22988
23026
 
22989
- function processParseErrors(parseValid) {
23027
+ function processParseErrors() {
22990
23028
  var errorKey = ctrl.$$parserName || 'parse';
22991
- if (parseValid === undefined) {
23029
+ if (parserValid === undefined) {
22992
23030
  setValidity(errorKey, null);
22993
23031
  } else {
22994
- setValidity(errorKey, parseValid);
22995
- if (!parseValid) {
23032
+ if (!parserValid) {
22996
23033
  forEach(ctrl.$validators, function(v, name) {
22997
23034
  setValidity(name, null);
22998
23035
  });
22999
23036
  forEach(ctrl.$asyncValidators, function(v, name) {
23000
23037
  setValidity(name, null);
23001
23038
  });
23002
- return false;
23003
23039
  }
23040
+ // Set the parse error last, to prevent unsetting it, should a $validators key == parserName
23041
+ setValidity(errorKey, parserValid);
23042
+ return parserValid;
23004
23043
  }
23005
23044
  return true;
23006
23045
  }
@@ -23095,7 +23134,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
23095
23134
  this.$$parseAndValidate = function() {
23096
23135
  var viewValue = ctrl.$$lastCommittedViewValue;
23097
23136
  var modelValue = viewValue;
23098
- var parserValid = isUndefined(modelValue) ? undefined : true;
23137
+ parserValid = isUndefined(modelValue) ? undefined : true;
23099
23138
 
23100
23139
  if (parserValid) {
23101
23140
  for (var i = 0; i < ctrl.$parsers.length; i++) {
@@ -23121,7 +23160,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
23121
23160
 
23122
23161
  // Pass the $$lastCommittedViewValue here, because the cached viewValue might be out of date.
23123
23162
  // This can happen if e.g. $setViewValue is called from inside a parser
23124
- ctrl.$$runValidators(parserValid, modelValue, ctrl.$$lastCommittedViewValue, function(allValid) {
23163
+ ctrl.$$runValidators(modelValue, ctrl.$$lastCommittedViewValue, function(allValid) {
23125
23164
  if (!allowInvalid) {
23126
23165
  // Note: Don't check ctrl.$valid here, as we could have
23127
23166
  // external validators (e.g. calculated on the server),
@@ -23242,6 +23281,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
23242
23281
  // TODO(perf): why not move this to the action fn?
23243
23282
  if (modelValue !== ctrl.$modelValue) {
23244
23283
  ctrl.$modelValue = ctrl.$$rawModelValue = modelValue;
23284
+ parserValid = undefined;
23245
23285
 
23246
23286
  var formatters = ctrl.$formatters,
23247
23287
  idx = formatters.length;
@@ -23254,7 +23294,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
23254
23294
  ctrl.$viewValue = ctrl.$$lastCommittedViewValue = viewValue;
23255
23295
  ctrl.$render();
23256
23296
 
23257
- ctrl.$$runValidators(undefined, modelValue, viewValue, noop);
23297
+ ctrl.$$runValidators(modelValue, viewValue, noop);
23258
23298
  }
23259
23299
  }
23260
23300
 
@@ -24070,6 +24110,55 @@ var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interp
24070
24110
  * when keys are deleted and reinstated.
24071
24111
  *
24072
24112
  *
24113
+ * # Tracking and Duplicates
24114
+ *
24115
+ * When the contents of the collection change, `ngRepeat` makes the corresponding changes to the DOM:
24116
+ *
24117
+ * * When an item is added, a new instance of the template is added to the DOM.
24118
+ * * When an item is removed, its template instance is removed from the DOM.
24119
+ * * When items are reordered, their respective templates are reordered in the DOM.
24120
+ *
24121
+ * By default, `ngRepeat` does not allow duplicate items in arrays. This is because when
24122
+ * there are duplicates, it is not possible to maintain a one-to-one mapping between collection
24123
+ * items and DOM elements.
24124
+ *
24125
+ * If you do need to repeat duplicate items, you can substitute the default tracking behavior
24126
+ * with your own using the `track by` expression.
24127
+ *
24128
+ * For example, you may track items by the index of each item in the collection, using the
24129
+ * special scope property `$index`:
24130
+ * ```html
24131
+ * <div ng-repeat="n in [42, 42, 43, 43] track by $index">
24132
+ * {{n}}
24133
+ * </div>
24134
+ * ```
24135
+ *
24136
+ * You may use arbitrary expressions in `track by`, including references to custom functions
24137
+ * on the scope:
24138
+ * ```html
24139
+ * <div ng-repeat="n in [42, 42, 43, 43] track by myTrackingFunction(n)">
24140
+ * {{n}}
24141
+ * </div>
24142
+ * ```
24143
+ *
24144
+ * If you are working with objects that have an identifier property, you can track
24145
+ * by the identifier instead of the whole object. Should you reload your data later, `ngRepeat`
24146
+ * will not have to rebuild the DOM elements for items it has already rendered, even if the
24147
+ * JavaScript objects in the collection have been substituted for new ones:
24148
+ * ```html
24149
+ * <div ng-repeat="model in collection track by model.id">
24150
+ * {{model.name}}
24151
+ * </div>
24152
+ * ```
24153
+ *
24154
+ * When no `track by` expression is provided, it is equivalent to tracking by the built-in
24155
+ * `$id` function, which tracks items by their identity:
24156
+ * ```html
24157
+ * <div ng-repeat="obj in collection track by $id(obj)">
24158
+ * {{obj.prop}}
24159
+ * </div>
24160
+ * ```
24161
+ *
24073
24162
  * # Special repeat start and end points
24074
24163
  * To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending
24075
24164
  * the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively.
@@ -24137,12 +24226,12 @@ var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interp
24137
24226
  *
24138
24227
  * For example: `(name, age) in {'adam':10, 'amalie':12}`.
24139
24228
  *
24140
- * * `variable in expression track by tracking_expression` – You can also provide an optional tracking function
24141
- * which can be used to associate the objects in the collection with the DOM elements. If no tracking function
24142
- * is specified the ng-repeat associates elements by identity in the collection. It is an error to have
24143
- * more than one tracking function to resolve to the same key. (This would mean that two distinct objects are
24144
- * mapped to the same DOM element, which is not possible.) Filters should be applied to the expression,
24145
- * before specifying a tracking expression.
24229
+ * * `variable in expression track by tracking_expression` – You can also provide an optional tracking expression
24230
+ * which can be used to associate the objects in the collection with the DOM elements. If no tracking expression
24231
+ * is specified, ng-repeat associates elements by identity. It is an error to have
24232
+ * more than one tracking expression value resolve to the same key. (This would mean that two distinct objects are
24233
+ * mapped to the same DOM element, which is not possible.) If filters are used in the expression, they should be
24234
+ * applied before the tracking expression.
24146
24235
  *
24147
24236
  * For example: `item in items` is equivalent to `item in items track by $id(item)`. This implies that the DOM elements
24148
24237
  * will be associated by item identity in the array.
@@ -24526,10 +24615,11 @@ var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';
24526
24615
  *
24527
24616
  * By default, the `.ng-hide` class will style the element with `display: none!important`. If you wish to change
24528
24617
  * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide`
24529
- * class in CSS:
24618
+ * class CSS. Note that the selector that needs to be used is actually `.ng-hide:not(.ng-hide-animate)` to cope
24619
+ * with extra animation classes that can be added.
24530
24620
  *
24531
24621
  * ```css
24532
- * .ng-hide {
24622
+ * .ng-hide:not(.ng-hide-animate) {
24533
24623
  * /&#42; this is just another form of hiding an element &#42;/
24534
24624
  * display: block!important;
24535
24625
  * position: absolute;
@@ -26045,7 +26135,7 @@ var maxlengthDirective = function() {
26045
26135
  ctrl.$validate();
26046
26136
  });
26047
26137
  ctrl.$validators.maxlength = function(modelValue, viewValue) {
26048
- return (maxlength < 0) || ctrl.$isEmpty(modelValue) || (viewValue.length <= maxlength);
26138
+ return (maxlength < 0) || ctrl.$isEmpty(viewValue) || (viewValue.length <= maxlength);
26049
26139
  };
26050
26140
  }
26051
26141
  };