angular-gem 1.2.19 → 1.2.20
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/lib/angular-gem/version.rb +1 -1
- data/vendor/assets/javascripts/1.2.20/angular-animate.js +1689 -0
- data/vendor/assets/javascripts/1.2.20/angular-cookies.js +206 -0
- data/vendor/assets/javascripts/1.2.20/angular-loader.js +414 -0
- data/vendor/assets/javascripts/1.2.20/angular-mocks.js +2171 -0
- data/vendor/assets/javascripts/1.2.20/angular-resource.js +619 -0
- data/vendor/assets/javascripts/1.2.20/angular-route.js +927 -0
- data/vendor/assets/javascripts/1.2.20/angular-sanitize.js +632 -0
- data/vendor/assets/javascripts/1.2.20/angular-scenario.js +33822 -0
- data/vendor/assets/javascripts/1.2.20/angular-touch.js +584 -0
- data/vendor/assets/javascripts/1.2.20/angular.js +21822 -0
- data/vendor/assets/javascripts/angular-animate.js +75 -19
- data/vendor/assets/javascripts/angular-cookies.js +17 -15
- data/vendor/assets/javascripts/angular-loader.js +2 -2
- data/vendor/assets/javascripts/angular-mocks.js +1 -1
- data/vendor/assets/javascripts/angular-resource.js +1 -1
- data/vendor/assets/javascripts/angular-route.js +1 -1
- data/vendor/assets/javascripts/angular-sanitize.js +25 -23
- data/vendor/assets/javascripts/angular-scenario.js +505 -461
- data/vendor/assets/javascripts/angular-touch.js +1 -1
- data/vendor/assets/javascripts/angular.js +505 -461
- metadata +11 -1
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
2
|
+
* @license AngularJS v1.2.20
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -68,7 +68,7 @@ function minErr(module) {
|
|
68
68
|
return match;
|
69
69
|
});
|
70
70
|
|
71
|
-
message = message + '\nhttp://errors.angularjs.org/1.2.
|
71
|
+
message = message + '\nhttp://errors.angularjs.org/1.2.20/' +
|
72
72
|
(module ? module + '/' : '') + code;
|
73
73
|
for (i = 2; i < arguments.length; i++) {
|
74
74
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
|
@@ -810,9 +810,9 @@ function isLeafNode (node) {
|
|
810
810
|
* @returns {*} The copy or updated `destination`, if `destination` was specified.
|
811
811
|
*
|
812
812
|
* @example
|
813
|
-
<example>
|
813
|
+
<example module="copyExample">
|
814
814
|
<file name="index.html">
|
815
|
-
<div ng-controller="
|
815
|
+
<div ng-controller="ExampleController">
|
816
816
|
<form novalidate class="simple-form">
|
817
817
|
Name: <input type="text" ng-model="user.name" /><br />
|
818
818
|
E-mail: <input type="email" ng-model="user.email" /><br />
|
@@ -826,21 +826,22 @@ function isLeafNode (node) {
|
|
826
826
|
</div>
|
827
827
|
|
828
828
|
<script>
|
829
|
-
|
830
|
-
$scope
|
829
|
+
angular.module('copyExample')
|
830
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
831
|
+
$scope.master= {};
|
831
832
|
|
832
|
-
|
833
|
-
|
834
|
-
|
835
|
-
|
833
|
+
$scope.update = function(user) {
|
834
|
+
// Example with 1 argument
|
835
|
+
$scope.master= angular.copy(user);
|
836
|
+
};
|
836
837
|
|
837
|
-
|
838
|
-
|
839
|
-
|
840
|
-
|
838
|
+
$scope.reset = function() {
|
839
|
+
// Example with 2 arguments
|
840
|
+
angular.copy($scope.master, $scope.user);
|
841
|
+
};
|
841
842
|
|
842
|
-
|
843
|
-
|
843
|
+
$scope.reset();
|
844
|
+
}]);
|
844
845
|
</script>
|
845
846
|
</file>
|
846
847
|
</example>
|
@@ -1184,7 +1185,7 @@ function parseKeyValue(/**string*/keyValue) {
|
|
1184
1185
|
key = tryDecodeURIComponent(key_value[0]);
|
1185
1186
|
if ( isDefined(key) ) {
|
1186
1187
|
var val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true;
|
1187
|
-
if (!obj
|
1188
|
+
if (!hasOwnProperty.call(obj, key)) {
|
1188
1189
|
obj[key] = val;
|
1189
1190
|
} else if(isArray(obj[key])) {
|
1190
1191
|
obj[key].push(val);
|
@@ -1958,11 +1959,11 @@ function setupModuleLoader(window) {
|
|
1958
1959
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
1959
1960
|
*/
|
1960
1961
|
var version = {
|
1961
|
-
full: '1.2.
|
1962
|
+
full: '1.2.20', // all of these placeholder strings will be replaced by grunt's
|
1962
1963
|
major: 1, // package task
|
1963
1964
|
minor: 2,
|
1964
|
-
dot:
|
1965
|
-
codeName: '
|
1965
|
+
dot: 20,
|
1966
|
+
codeName: 'accidental-beautification'
|
1966
1967
|
};
|
1967
1968
|
|
1968
1969
|
|
@@ -5241,7 +5242,7 @@ function $TemplateCacheProvider() {
|
|
5241
5242
|
* local name. Given `<widget my-attr="count = count + value">` and widget definition of
|
5242
5243
|
* `scope: { localFn:'&myAttr' }`, then isolate scope property `localFn` will point to
|
5243
5244
|
* a function wrapper for the `count = count + value` expression. Often it's desirable to
|
5244
|
-
* pass data from the isolated scope via an expression
|
5245
|
+
* pass data from the isolated scope via an expression to the parent scope, this can be
|
5245
5246
|
* done by passing a map of local variable names and values into the expression wrapper fn.
|
5246
5247
|
* For example, if the expression is `increment(amount)` then we can specify the amount value
|
5247
5248
|
* by calling the `localFn` as `localFn({amount: 22})`.
|
@@ -5468,10 +5469,10 @@ function $TemplateCacheProvider() {
|
|
5468
5469
|
* to illustrate how `$compile` works.
|
5469
5470
|
* </div>
|
5470
5471
|
*
|
5471
|
-
<example module="
|
5472
|
+
<example module="compileExample">
|
5472
5473
|
<file name="index.html">
|
5473
5474
|
<script>
|
5474
|
-
angular.module('
|
5475
|
+
angular.module('compileExample', [], function($compileProvider) {
|
5475
5476
|
// configure new 'compile' directive by passing a directive
|
5476
5477
|
// factory function. The factory function injects the '$compile'
|
5477
5478
|
$compileProvider.directive('compile', function($compile) {
|
@@ -5495,15 +5496,14 @@ function $TemplateCacheProvider() {
|
|
5495
5496
|
}
|
5496
5497
|
);
|
5497
5498
|
};
|
5498
|
-
})
|
5499
|
-
})
|
5500
|
-
|
5501
|
-
function Ctrl($scope) {
|
5499
|
+
});
|
5500
|
+
})
|
5501
|
+
.controller('GreeterController', ['$scope', function($scope) {
|
5502
5502
|
$scope.name = 'Angular';
|
5503
5503
|
$scope.html = 'Hello {{name}}';
|
5504
|
-
}
|
5504
|
+
}]);
|
5505
5505
|
</script>
|
5506
|
-
<div ng-controller="
|
5506
|
+
<div ng-controller="GreeterController">
|
5507
5507
|
<input ng-model="name"> <br>
|
5508
5508
|
<textarea ng-model="html"></textarea> <br>
|
5509
5509
|
<div compile="html"></div>
|
@@ -7239,18 +7239,19 @@ function $ControllerProvider() {
|
|
7239
7239
|
* A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object.
|
7240
7240
|
*
|
7241
7241
|
* @example
|
7242
|
-
<example>
|
7242
|
+
<example module="documentExample">
|
7243
7243
|
<file name="index.html">
|
7244
|
-
<div ng-controller="
|
7244
|
+
<div ng-controller="ExampleController">
|
7245
7245
|
<p>$document title: <b ng-bind="title"></b></p>
|
7246
7246
|
<p>window.document title: <b ng-bind="windowTitle"></b></p>
|
7247
7247
|
</div>
|
7248
7248
|
</file>
|
7249
7249
|
<file name="script.js">
|
7250
|
-
|
7251
|
-
$scope
|
7252
|
-
|
7253
|
-
|
7250
|
+
angular.module('documentExample', [])
|
7251
|
+
.controller('ExampleController', ['$scope', '$document', function($scope, $document) {
|
7252
|
+
$scope.title = $document[0].title;
|
7253
|
+
$scope.windowTitle = angular.element(window.document)[0].title;
|
7254
|
+
}]);
|
7254
7255
|
</file>
|
7255
7256
|
</example>
|
7256
7257
|
*/
|
@@ -7383,12 +7384,39 @@ function isSuccess(status) {
|
|
7383
7384
|
}
|
7384
7385
|
|
7385
7386
|
|
7387
|
+
/**
|
7388
|
+
* @ngdoc provider
|
7389
|
+
* @name $httpProvider
|
7390
|
+
* @description
|
7391
|
+
* Use `$httpProvider` to change the default behavior of the {@link ng.$http $http} service.
|
7392
|
+
* */
|
7386
7393
|
function $HttpProvider() {
|
7387
7394
|
var JSON_START = /^\s*(\[|\{[^\{])/,
|
7388
7395
|
JSON_END = /[\}\]]\s*$/,
|
7389
7396
|
PROTECTION_PREFIX = /^\)\]\}',?\n/,
|
7390
7397
|
CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': 'application/json;charset=utf-8'};
|
7391
7398
|
|
7399
|
+
/**
|
7400
|
+
* @ngdoc property
|
7401
|
+
* @name $httpProvider#defaults
|
7402
|
+
* @description
|
7403
|
+
*
|
7404
|
+
* Object containing default values for all {@link ng.$http $http} requests.
|
7405
|
+
*
|
7406
|
+
* - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token.
|
7407
|
+
* Defaults value is `'XSRF-TOKEN'`.
|
7408
|
+
*
|
7409
|
+
* - **`defaults.xsrfHeaderName`** - {string} - Name of HTTP header to populate with the
|
7410
|
+
* XSRF token. Defaults value is `'X-XSRF-TOKEN'`.
|
7411
|
+
*
|
7412
|
+
* - **`defaults.headers`** - {Object} - Default headers for all $http requests.
|
7413
|
+
* Refer to {@link ng.$http#setting-http-headers $http} for documentation on
|
7414
|
+
* setting default headers.
|
7415
|
+
* - **`defaults.headers.common`**
|
7416
|
+
* - **`defaults.headers.post`**
|
7417
|
+
* - **`defaults.headers.put`**
|
7418
|
+
* - **`defaults.headers.patch`**
|
7419
|
+
**/
|
7392
7420
|
var defaults = this.defaults = {
|
7393
7421
|
// transform incoming response data
|
7394
7422
|
transformResponse: [function(data) {
|
@@ -7878,9 +7906,9 @@ function $HttpProvider() {
|
|
7878
7906
|
*
|
7879
7907
|
*
|
7880
7908
|
* @example
|
7881
|
-
<example>
|
7909
|
+
<example module="httpExample">
|
7882
7910
|
<file name="index.html">
|
7883
|
-
<div ng-controller="
|
7911
|
+
<div ng-controller="FetchController">
|
7884
7912
|
<select ng-model="method">
|
7885
7913
|
<option>GET</option>
|
7886
7914
|
<option>JSONP</option>
|
@@ -7902,30 +7930,32 @@ function $HttpProvider() {
|
|
7902
7930
|
</div>
|
7903
7931
|
</file>
|
7904
7932
|
<file name="script.js">
|
7905
|
-
|
7906
|
-
$scope
|
7907
|
-
|
7908
|
-
|
7909
|
-
|
7910
|
-
|
7911
|
-
|
7912
|
-
|
7913
|
-
|
7914
|
-
|
7915
|
-
$scope.
|
7916
|
-
|
7917
|
-
|
7918
|
-
|
7919
|
-
|
7920
|
-
|
7921
|
-
|
7922
|
-
|
7933
|
+
angular.module('httpExample', [])
|
7934
|
+
.controller('FetchController', ['$scope', '$http', '$templateCache',
|
7935
|
+
function($scope, $http, $templateCache) {
|
7936
|
+
$scope.method = 'GET';
|
7937
|
+
$scope.url = 'http-hello.html';
|
7938
|
+
|
7939
|
+
$scope.fetch = function() {
|
7940
|
+
$scope.code = null;
|
7941
|
+
$scope.response = null;
|
7942
|
+
|
7943
|
+
$http({method: $scope.method, url: $scope.url, cache: $templateCache}).
|
7944
|
+
success(function(data, status) {
|
7945
|
+
$scope.status = status;
|
7946
|
+
$scope.data = data;
|
7947
|
+
}).
|
7948
|
+
error(function(data, status) {
|
7949
|
+
$scope.data = data || "Request failed";
|
7950
|
+
$scope.status = status;
|
7951
|
+
});
|
7952
|
+
};
|
7923
7953
|
|
7924
|
-
|
7925
|
-
|
7926
|
-
|
7927
|
-
|
7928
|
-
|
7954
|
+
$scope.updateModel = function(method, url) {
|
7955
|
+
$scope.method = method;
|
7956
|
+
$scope.url = url;
|
7957
|
+
};
|
7958
|
+
}]);
|
7929
7959
|
</file>
|
7930
7960
|
<file name="http-hello.html">
|
7931
7961
|
Hello, $http!
|
@@ -7979,7 +8009,7 @@ function $HttpProvider() {
|
|
7979
8009
|
var reqData = transformData(config.data, headersGetter(headers), config.transformRequest);
|
7980
8010
|
|
7981
8011
|
// strip content-type if data is undefined
|
7982
|
-
if (isUndefined(
|
8012
|
+
if (isUndefined(reqData)) {
|
7983
8013
|
forEach(headers, function(value, header) {
|
7984
8014
|
if (lowercase(header) === 'content-type') {
|
7985
8015
|
delete headers[header];
|
@@ -8048,10 +8078,6 @@ function $HttpProvider() {
|
|
8048
8078
|
|
8049
8079
|
defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]);
|
8050
8080
|
|
8051
|
-
// execute if header value is function
|
8052
|
-
execHeaders(defHeaders);
|
8053
|
-
execHeaders(reqHeaders);
|
8054
|
-
|
8055
8081
|
// using for-in instead of forEach to avoid unecessary iteration after header has been found
|
8056
8082
|
defaultHeadersIteration:
|
8057
8083
|
for (defHeaderName in defHeaders) {
|
@@ -8066,6 +8092,8 @@ function $HttpProvider() {
|
|
8066
8092
|
reqHeaders[defHeaderName] = defHeaders[defHeaderName];
|
8067
8093
|
}
|
8068
8094
|
|
8095
|
+
// execute if header value is a function for merged headers
|
8096
|
+
execHeaders(reqHeaders);
|
8069
8097
|
return reqHeaders;
|
8070
8098
|
|
8071
8099
|
function execHeaders(headers) {
|
@@ -8841,25 +8869,27 @@ function $IntervalProvider() {
|
|
8841
8869
|
* @returns {promise} A promise which will be notified on each iteration.
|
8842
8870
|
*
|
8843
8871
|
* @example
|
8844
|
-
* <example module="
|
8845
|
-
*
|
8846
|
-
*
|
8847
|
-
*
|
8848
|
-
*
|
8849
|
-
* $scope
|
8850
|
-
*
|
8872
|
+
* <example module="intervalExample">
|
8873
|
+
* <file name="index.html">
|
8874
|
+
* <script>
|
8875
|
+
* angular.module('intervalExample', [])
|
8876
|
+
* .controller('ExampleController', ['$scope', '$interval',
|
8877
|
+
* function($scope, $interval) {
|
8878
|
+
* $scope.format = 'M/d/yy h:mm:ss a';
|
8879
|
+
* $scope.blood_1 = 100;
|
8880
|
+
* $scope.blood_2 = 120;
|
8851
8881
|
*
|
8852
|
-
*
|
8853
|
-
*
|
8854
|
-
*
|
8855
|
-
*
|
8882
|
+
* var stop;
|
8883
|
+
* $scope.fight = function() {
|
8884
|
+
* // Don't start a new fight if we are already fighting
|
8885
|
+
* if ( angular.isDefined(stop) ) return;
|
8856
8886
|
*
|
8857
8887
|
* stop = $interval(function() {
|
8858
8888
|
* if ($scope.blood_1 > 0 && $scope.blood_2 > 0) {
|
8859
|
-
*
|
8860
|
-
*
|
8889
|
+
* $scope.blood_1 = $scope.blood_1 - 3;
|
8890
|
+
* $scope.blood_2 = $scope.blood_2 - 4;
|
8861
8891
|
* } else {
|
8862
|
-
*
|
8892
|
+
* $scope.stopFight();
|
8863
8893
|
* }
|
8864
8894
|
* }, 100);
|
8865
8895
|
* };
|
@@ -8874,22 +8904,21 @@ function $IntervalProvider() {
|
|
8874
8904
|
* $scope.resetFight = function() {
|
8875
8905
|
* $scope.blood_1 = 100;
|
8876
8906
|
* $scope.blood_2 = 120;
|
8877
|
-
* }
|
8907
|
+
* };
|
8878
8908
|
*
|
8879
8909
|
* $scope.$on('$destroy', function() {
|
8880
|
-
* // Make sure that the interval
|
8910
|
+
* // Make sure that the interval nis destroyed too
|
8881
8911
|
* $scope.stopFight();
|
8882
8912
|
* });
|
8883
|
-
* }
|
8884
|
-
*
|
8885
|
-
*
|
8886
|
-
*
|
8887
|
-
*
|
8888
|
-
* .directive('myCurrentTime', function($interval, dateFilter) {
|
8913
|
+
* })
|
8914
|
+
* // Register the 'myCurrentTime' directive factory method.
|
8915
|
+
* // We inject $interval and dateFilter service since the factory method is DI.
|
8916
|
+
* .directive('myCurrentTime', ['$interval', 'dateFilter',
|
8917
|
+
* function($interval, dateFilter) {
|
8889
8918
|
* // return the directive link function. (compile function not needed)
|
8890
8919
|
* return function(scope, element, attrs) {
|
8891
8920
|
* var format, // date format
|
8892
|
-
*
|
8921
|
+
* stopTime; // so that we can cancel the time updates
|
8893
8922
|
*
|
8894
8923
|
* // used to update the UI
|
8895
8924
|
* function updateTime() {
|
@@ -8905,28 +8934,28 @@ function $IntervalProvider() {
|
|
8905
8934
|
* stopTime = $interval(updateTime, 1000);
|
8906
8935
|
*
|
8907
8936
|
* // listen on DOM destroy (removal) event, and cancel the next UI update
|
8908
|
-
* // to prevent updating time
|
8937
|
+
* // to prevent updating time after the DOM element was removed.
|
8909
8938
|
* element.bind('$destroy', function() {
|
8910
8939
|
* $interval.cancel(stopTime);
|
8911
8940
|
* });
|
8912
8941
|
* }
|
8913
8942
|
* });
|
8914
|
-
*
|
8943
|
+
* </script>
|
8915
8944
|
*
|
8916
|
-
*
|
8917
|
-
*
|
8918
|
-
*
|
8919
|
-
*
|
8920
|
-
*
|
8921
|
-
*
|
8922
|
-
*
|
8923
|
-
*
|
8924
|
-
*
|
8925
|
-
*
|
8926
|
-
* </div>
|
8945
|
+
* <div>
|
8946
|
+
* <div ng-controller="ExampleController">
|
8947
|
+
* Date format: <input ng-model="format"> <hr/>
|
8948
|
+
* Current time is: <span my-current-time="format"></span>
|
8949
|
+
* <hr/>
|
8950
|
+
* Blood 1 : <font color='red'>{{blood_1}}</font>
|
8951
|
+
* Blood 2 : <font color='red'>{{blood_2}}</font>
|
8952
|
+
* <button type="button" data-ng-click="fight()">Fight</button>
|
8953
|
+
* <button type="button" data-ng-click="stopFight()">StopFight</button>
|
8954
|
+
* <button type="button" data-ng-click="resetFight()">resetFight</button>
|
8927
8955
|
* </div>
|
8956
|
+
* </div>
|
8928
8957
|
*
|
8929
|
-
*
|
8958
|
+
* </file>
|
8930
8959
|
* </example>
|
8931
8960
|
*/
|
8932
8961
|
function interval(fn, delay, count, invokeApply) {
|
@@ -9483,14 +9512,17 @@ LocationHashbangInHtml5Url.prototype =
|
|
9483
9512
|
* If the argument is a hash object containing an array of values, these values will be encoded
|
9484
9513
|
* as duplicate search parameters in the url.
|
9485
9514
|
*
|
9486
|
-
* @param {(string|Array<string
|
9487
|
-
* override only a single search property.
|
9515
|
+
* @param {(string|Array<string>|boolean)=} paramValue If `search` is a string, then `paramValue`
|
9516
|
+
* will override only a single search property.
|
9488
9517
|
*
|
9489
9518
|
* If `paramValue` is an array, it will override the property of the `search` component of
|
9490
9519
|
* `$location` specified via the first argument.
|
9491
9520
|
*
|
9492
9521
|
* If `paramValue` is `null`, the property specified via the first argument will be deleted.
|
9493
9522
|
*
|
9523
|
+
* If `paramValue` is `true`, the property specified via the first argument will be added with no
|
9524
|
+
* value nor trailing equal sign.
|
9525
|
+
*
|
9494
9526
|
* @return {Object} If called with no arguments returns the parsed `search` object. If called with
|
9495
9527
|
* one or more arguments returns `$location` object itself.
|
9496
9528
|
*/
|
@@ -9502,6 +9534,11 @@ LocationHashbangInHtml5Url.prototype =
|
|
9502
9534
|
if (isString(search)) {
|
9503
9535
|
this.$$search = parseKeyValue(search);
|
9504
9536
|
} else if (isObject(search)) {
|
9537
|
+
// remove object undefined or null properties
|
9538
|
+
forEach(search, function(value, key) {
|
9539
|
+
if (value == null) delete search[key];
|
9540
|
+
});
|
9541
|
+
|
9505
9542
|
this.$$search = search;
|
9506
9543
|
} else {
|
9507
9544
|
throw $locationMinErr('isrcharg',
|
@@ -9823,15 +9860,16 @@ function $LocationProvider(){
|
|
9823
9860
|
* {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this.
|
9824
9861
|
*
|
9825
9862
|
* @example
|
9826
|
-
<example>
|
9863
|
+
<example module="logExample">
|
9827
9864
|
<file name="script.js">
|
9828
|
-
|
9829
|
-
$scope
|
9830
|
-
|
9831
|
-
|
9865
|
+
angular.module('logExample', [])
|
9866
|
+
.controller('LogController', ['$scope', '$log', function($scope, $log) {
|
9867
|
+
$scope.$log = $log;
|
9868
|
+
$scope.message = 'Hello World!';
|
9869
|
+
}]);
|
9832
9870
|
</file>
|
9833
9871
|
<file name="index.html">
|
9834
|
-
<div ng-controller="
|
9872
|
+
<div ng-controller="LogController">
|
9835
9873
|
<p>Reload this page with open console, enter text and hit the log button...</p>
|
9836
9874
|
Message:
|
9837
9875
|
<input type="text" ng-model="message"/>
|
@@ -9855,7 +9893,7 @@ function $LogProvider(){
|
|
9855
9893
|
self = this;
|
9856
9894
|
|
9857
9895
|
/**
|
9858
|
-
* @ngdoc
|
9896
|
+
* @ngdoc method
|
9859
9897
|
* @name $logProvider#debugEnabled
|
9860
9898
|
* @description
|
9861
9899
|
* @param {boolean=} flag enable or disable debug level messages
|
@@ -10954,26 +10992,6 @@ function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) {
|
|
10954
10992
|
};
|
10955
10993
|
}
|
10956
10994
|
|
10957
|
-
function simpleGetterFn1(key0, fullExp) {
|
10958
|
-
ensureSafeMemberName(key0, fullExp);
|
10959
|
-
|
10960
|
-
return function simpleGetterFn1(scope, locals) {
|
10961
|
-
if (scope == null) return undefined;
|
10962
|
-
return ((locals && locals.hasOwnProperty(key0)) ? locals : scope)[key0];
|
10963
|
-
};
|
10964
|
-
}
|
10965
|
-
|
10966
|
-
function simpleGetterFn2(key0, key1, fullExp) {
|
10967
|
-
ensureSafeMemberName(key0, fullExp);
|
10968
|
-
ensureSafeMemberName(key1, fullExp);
|
10969
|
-
|
10970
|
-
return function simpleGetterFn2(scope, locals) {
|
10971
|
-
if (scope == null) return undefined;
|
10972
|
-
scope = ((locals && locals.hasOwnProperty(key0)) ? locals : scope)[key0];
|
10973
|
-
return scope == null ? undefined : scope[key1];
|
10974
|
-
};
|
10975
|
-
}
|
10976
|
-
|
10977
10995
|
function getterFn(path, options, fullExp) {
|
10978
10996
|
// Check whether the cache has this getter already.
|
10979
10997
|
// We can use hasOwnProperty directly on the cache because we ensure,
|
@@ -10986,13 +11004,8 @@ function getterFn(path, options, fullExp) {
|
|
10986
11004
|
pathKeysLength = pathKeys.length,
|
10987
11005
|
fn;
|
10988
11006
|
|
10989
|
-
// When we have only 1 or 2 tokens, use optimized special case closures.
|
10990
11007
|
// http://jsperf.com/angularjs-parse-getter/6
|
10991
|
-
if (
|
10992
|
-
fn = simpleGetterFn1(pathKeys[0], fullExp);
|
10993
|
-
} else if (!options.unwrapPromises && pathKeysLength === 2) {
|
10994
|
-
fn = simpleGetterFn2(pathKeys[0], pathKeys[1], fullExp);
|
10995
|
-
} else if (options.csp) {
|
11008
|
+
if (options.csp) {
|
10996
11009
|
if (pathKeysLength < 6) {
|
10997
11010
|
fn = cspSafeGetterFn(pathKeys[0], pathKeys[1], pathKeys[2], pathKeys[3], pathKeys[4], fullExp,
|
10998
11011
|
options);
|
@@ -13119,19 +13132,21 @@ function adjustMatchers(matchers) {
|
|
13119
13132
|
*
|
13120
13133
|
* Here is what a secure configuration for this scenario might look like:
|
13121
13134
|
*
|
13122
|
-
*
|
13123
|
-
*
|
13124
|
-
*
|
13125
|
-
*
|
13126
|
-
*
|
13127
|
-
*
|
13128
|
-
*
|
13129
|
-
*
|
13130
|
-
*
|
13131
|
-
*
|
13132
|
-
*
|
13133
|
-
*
|
13134
|
-
*
|
13135
|
+
* ```
|
13136
|
+
* angular.module('myApp', []).config(function($sceDelegateProvider) {
|
13137
|
+
* $sceDelegateProvider.resourceUrlWhitelist([
|
13138
|
+
* // Allow same origin resource loads.
|
13139
|
+
* 'self',
|
13140
|
+
* // Allow loading from our assets domain. Notice the difference between * and **.
|
13141
|
+
* 'http://srv*.assets.example.com/**'
|
13142
|
+
* ]);
|
13143
|
+
*
|
13144
|
+
* // The blacklist overrides the whitelist so the open redirect here is blocked.
|
13145
|
+
* $sceDelegateProvider.resourceUrlBlacklist([
|
13146
|
+
* 'http://myapp.example.com/clickThru**'
|
13147
|
+
* ]);
|
13148
|
+
* });
|
13149
|
+
* ```
|
13135
13150
|
*/
|
13136
13151
|
|
13137
13152
|
function $SceDelegateProvider() {
|
@@ -13426,10 +13441,10 @@ function $SceDelegateProvider() {
|
|
13426
13441
|
*
|
13427
13442
|
* Here's an example of a binding in a privileged context:
|
13428
13443
|
*
|
13429
|
-
*
|
13430
|
-
*
|
13431
|
-
*
|
13432
|
-
*
|
13444
|
+
* ```
|
13445
|
+
* <input ng-model="userHtml">
|
13446
|
+
* <div ng-bind-html="userHtml"></div>
|
13447
|
+
* ```
|
13433
13448
|
*
|
13434
13449
|
* Notice that `ng-bind-html` is bound to `userHtml` controlled by the user. With SCE
|
13435
13450
|
* disabled, this application allows the user to render arbitrary HTML into the DIV.
|
@@ -13469,15 +13484,15 @@ function $SceDelegateProvider() {
|
|
13469
13484
|
* ng.$sce#parseAsHtml $sce.parseAsHtml(binding expression)}. Here's the actual code (slightly
|
13470
13485
|
* simplified):
|
13471
13486
|
*
|
13472
|
-
*
|
13473
|
-
*
|
13474
|
-
*
|
13475
|
-
*
|
13476
|
-
*
|
13477
|
-
*
|
13478
|
-
*
|
13479
|
-
*
|
13480
|
-
*
|
13487
|
+
* ```
|
13488
|
+
* var ngBindHtmlDirective = ['$sce', function($sce) {
|
13489
|
+
* return function(scope, element, attr) {
|
13490
|
+
* scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) {
|
13491
|
+
* element.html(value || '');
|
13492
|
+
* });
|
13493
|
+
* };
|
13494
|
+
* }];
|
13495
|
+
* ```
|
13481
13496
|
*
|
13482
13497
|
* ## Impact on loading templates
|
13483
13498
|
*
|
@@ -13581,66 +13596,65 @@ function $SceDelegateProvider() {
|
|
13581
13596
|
*
|
13582
13597
|
* ## Show me an example using SCE.
|
13583
13598
|
*
|
13584
|
-
*
|
13585
|
-
<
|
13586
|
-
<
|
13587
|
-
|
13588
|
-
|
13589
|
-
|
13590
|
-
|
13591
|
-
|
13592
|
-
|
13593
|
-
|
13594
|
-
|
13595
|
-
|
13596
|
-
|
13597
|
-
|
13598
|
-
|
13599
|
-
|
13600
|
-
|
13601
|
-
|
13602
|
-
|
13603
|
-
|
13604
|
-
|
13605
|
-
|
13606
|
-
|
13607
|
-
|
13608
|
-
|
13609
|
-
|
13610
|
-
|
13611
|
-
|
13612
|
-
|
13613
|
-
|
13614
|
-
|
13615
|
-
|
13616
|
-
|
13617
|
-
|
13618
|
-
|
13619
|
-
|
13620
|
-
|
13621
|
-
|
13622
|
-
|
13623
|
-
|
13624
|
-
|
13625
|
-
|
13626
|
-
|
13627
|
-
|
13628
|
-
|
13629
|
-
|
13630
|
-
|
13631
|
-
|
13632
|
-
|
13633
|
-
|
13634
|
-
|
13635
|
-
|
13636
|
-
|
13637
|
-
|
13638
|
-
|
13639
|
-
|
13640
|
-
|
13641
|
-
|
13642
|
-
</
|
13643
|
-
</example>
|
13599
|
+
* <example module="mySceApp" deps="angular-sanitize.js">
|
13600
|
+
* <file name="index.html">
|
13601
|
+
* <div ng-controller="myAppController as myCtrl">
|
13602
|
+
* <i ng-bind-html="myCtrl.explicitlyTrustedHtml" id="explicitlyTrustedHtml"></i><br><br>
|
13603
|
+
* <b>User comments</b><br>
|
13604
|
+
* By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when
|
13605
|
+
* $sanitize is available. If $sanitize isn't available, this results in an error instead of an
|
13606
|
+
* exploit.
|
13607
|
+
* <div class="well">
|
13608
|
+
* <div ng-repeat="userComment in myCtrl.userComments">
|
13609
|
+
* <b>{{userComment.name}}</b>:
|
13610
|
+
* <span ng-bind-html="userComment.htmlComment" class="htmlComment"></span>
|
13611
|
+
* <br>
|
13612
|
+
* </div>
|
13613
|
+
* </div>
|
13614
|
+
* </div>
|
13615
|
+
* </file>
|
13616
|
+
*
|
13617
|
+
* <file name="script.js">
|
13618
|
+
* var mySceApp = angular.module('mySceApp', ['ngSanitize']);
|
13619
|
+
*
|
13620
|
+
* mySceApp.controller("myAppController", function myAppController($http, $templateCache, $sce) {
|
13621
|
+
* var self = this;
|
13622
|
+
* $http.get("test_data.json", {cache: $templateCache}).success(function(userComments) {
|
13623
|
+
* self.userComments = userComments;
|
13624
|
+
* });
|
13625
|
+
* self.explicitlyTrustedHtml = $sce.trustAsHtml(
|
13626
|
+
* '<span onmouseover="this.textContent="Explicitly trusted HTML bypasses ' +
|
13627
|
+
* 'sanitization."">Hover over this text.</span>');
|
13628
|
+
* });
|
13629
|
+
* </file>
|
13630
|
+
*
|
13631
|
+
* <file name="test_data.json">
|
13632
|
+
* [
|
13633
|
+
* { "name": "Alice",
|
13634
|
+
* "htmlComment":
|
13635
|
+
* "<span onmouseover='this.textContent=\"PWN3D!\"'>Is <i>anyone</i> reading this?</span>"
|
13636
|
+
* },
|
13637
|
+
* { "name": "Bob",
|
13638
|
+
* "htmlComment": "<i>Yes!</i> Am I the only other one?"
|
13639
|
+
* }
|
13640
|
+
* ]
|
13641
|
+
* </file>
|
13642
|
+
*
|
13643
|
+
* <file name="protractor.js" type="protractor">
|
13644
|
+
* describe('SCE doc demo', function() {
|
13645
|
+
* it('should sanitize untrusted values', function() {
|
13646
|
+
* expect(element.all(by.css('.htmlComment')).first().getInnerHtml())
|
13647
|
+
* .toBe('<span>Is <i>anyone</i> reading this?</span>');
|
13648
|
+
* });
|
13649
|
+
*
|
13650
|
+
* it('should NOT sanitize explicitly trusted values', function() {
|
13651
|
+
* expect(element(by.id('explicitlyTrustedHtml')).getInnerHtml()).toBe(
|
13652
|
+
* '<span onmouseover="this.textContent="Explicitly trusted HTML bypasses ' +
|
13653
|
+
* 'sanitization."">Hover over this text.</span>');
|
13654
|
+
* });
|
13655
|
+
* });
|
13656
|
+
* </file>
|
13657
|
+
* </example>
|
13644
13658
|
*
|
13645
13659
|
*
|
13646
13660
|
*
|
@@ -13654,13 +13668,13 @@ function $SceDelegateProvider() {
|
|
13654
13668
|
*
|
13655
13669
|
* That said, here's how you can completely disable SCE:
|
13656
13670
|
*
|
13657
|
-
*
|
13658
|
-
*
|
13659
|
-
*
|
13660
|
-
*
|
13661
|
-
*
|
13662
|
-
*
|
13663
|
-
*
|
13671
|
+
* ```
|
13672
|
+
* angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) {
|
13673
|
+
* // Completely disable SCE. For demonstration purposes only!
|
13674
|
+
* // Do not use in new projects.
|
13675
|
+
* $sceProvider.enabled(false);
|
13676
|
+
* });
|
13677
|
+
* ```
|
13664
13678
|
*
|
13665
13679
|
*/
|
13666
13680
|
/* jshint maxlen: 100 */
|
@@ -14357,17 +14371,18 @@ function urlIsSameOrigin(requestUrl) {
|
|
14357
14371
|
* expression.
|
14358
14372
|
*
|
14359
14373
|
* @example
|
14360
|
-
<example>
|
14374
|
+
<example module="windowExample">
|
14361
14375
|
<file name="index.html">
|
14362
14376
|
<script>
|
14363
|
-
|
14364
|
-
$scope
|
14365
|
-
|
14377
|
+
angular.module('windowExample', [])
|
14378
|
+
.controller('ExampleController', ['$scope', '$window', function ($scope, $window) {
|
14379
|
+
$scope.greeting = 'Hello, World!';
|
14380
|
+
$scope.doGreeting = function(greeting) {
|
14366
14381
|
$window.alert(greeting);
|
14367
|
-
|
14368
|
-
|
14382
|
+
};
|
14383
|
+
}]);
|
14369
14384
|
</script>
|
14370
|
-
<div ng-controller="
|
14385
|
+
<div ng-controller="ExampleController">
|
14371
14386
|
<input type="text" ng-model="greeting" />
|
14372
14387
|
<button ng-click="doGreeting(greeting)">ALERT</button>
|
14373
14388
|
</div>
|
@@ -14766,14 +14781,15 @@ function filterFilter() {
|
|
14766
14781
|
*
|
14767
14782
|
*
|
14768
14783
|
* @example
|
14769
|
-
<example>
|
14784
|
+
<example module="currencyExample">
|
14770
14785
|
<file name="index.html">
|
14771
14786
|
<script>
|
14772
|
-
|
14773
|
-
$scope
|
14774
|
-
|
14787
|
+
angular.module('currencyExample', [])
|
14788
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
14789
|
+
$scope.amount = 1234.56;
|
14790
|
+
}]);
|
14775
14791
|
</script>
|
14776
|
-
<div ng-controller="
|
14792
|
+
<div ng-controller="ExampleController">
|
14777
14793
|
<input type="number" ng-model="amount"> <br>
|
14778
14794
|
default currency symbol ($): <span id="currency-default">{{amount | currency}}</span><br>
|
14779
14795
|
custom currency identifier (USD$): <span>{{amount | currency:"USD$"}}</span>
|
@@ -14825,14 +14841,15 @@ function currencyFilter($locale) {
|
|
14825
14841
|
* @returns {string} Number rounded to decimalPlaces and places a “,” after each third digit.
|
14826
14842
|
*
|
14827
14843
|
* @example
|
14828
|
-
<example>
|
14844
|
+
<example module="numberFilterExample">
|
14829
14845
|
<file name="index.html">
|
14830
14846
|
<script>
|
14831
|
-
|
14832
|
-
$scope
|
14833
|
-
|
14847
|
+
angular.module('numberFilterExample', [])
|
14848
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
14849
|
+
$scope.val = 1234.56789;
|
14850
|
+
}]);
|
14834
14851
|
</script>
|
14835
|
-
<div ng-controller="
|
14852
|
+
<div ng-controller="ExampleController">
|
14836
14853
|
Enter number: <input ng-model='val'><br>
|
14837
14854
|
Default formatting: <span id='number-default'>{{val | number}}</span><br>
|
14838
14855
|
No fractions: <span>{{val | number:0}}</span><br>
|
@@ -15256,17 +15273,18 @@ var uppercaseFilter = valueFn(uppercase);
|
|
15256
15273
|
* had less than `limit` elements.
|
15257
15274
|
*
|
15258
15275
|
* @example
|
15259
|
-
<example>
|
15276
|
+
<example module="limitToExample">
|
15260
15277
|
<file name="index.html">
|
15261
15278
|
<script>
|
15262
|
-
|
15263
|
-
$scope
|
15264
|
-
|
15265
|
-
|
15266
|
-
|
15267
|
-
|
15279
|
+
angular.module('limitToExample', [])
|
15280
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
15281
|
+
$scope.numbers = [1,2,3,4,5,6,7,8,9];
|
15282
|
+
$scope.letters = "abcdefghi";
|
15283
|
+
$scope.numLimit = 3;
|
15284
|
+
$scope.letterLimit = 3;
|
15285
|
+
}]);
|
15268
15286
|
</script>
|
15269
|
-
<div ng-controller="
|
15287
|
+
<div ng-controller="ExampleController">
|
15270
15288
|
Limit {{numbers}} to: <input type="integer" ng-model="numLimit">
|
15271
15289
|
<p>Output numbers: {{ numbers | limitTo:numLimit }}</p>
|
15272
15290
|
Limit {{letters}} to: <input type="integer" ng-model="letterLimit">
|
@@ -15378,20 +15396,21 @@ function limitToFilter(){
|
|
15378
15396
|
* @returns {Array} Sorted copy of the source array.
|
15379
15397
|
*
|
15380
15398
|
* @example
|
15381
|
-
<example>
|
15399
|
+
<example module="orderByExample">
|
15382
15400
|
<file name="index.html">
|
15383
15401
|
<script>
|
15384
|
-
|
15385
|
-
$scope
|
15386
|
-
|
15387
|
-
|
15388
|
-
|
15389
|
-
|
15390
|
-
|
15391
|
-
|
15392
|
-
|
15402
|
+
angular.module('orderByExample', [])
|
15403
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
15404
|
+
$scope.friends =
|
15405
|
+
[{name:'John', phone:'555-1212', age:10},
|
15406
|
+
{name:'Mary', phone:'555-9876', age:19},
|
15407
|
+
{name:'Mike', phone:'555-4321', age:21},
|
15408
|
+
{name:'Adam', phone:'555-5678', age:35},
|
15409
|
+
{name:'Julie', phone:'555-8765', age:29}];
|
15410
|
+
$scope.predicate = '-age';
|
15411
|
+
}]);
|
15393
15412
|
</script>
|
15394
|
-
<div ng-controller="
|
15413
|
+
<div ng-controller="ExampleController">
|
15395
15414
|
<pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>
|
15396
15415
|
<hr/>
|
15397
15416
|
[ <a href="" ng-click="predicate=''">unsorted</a> ]
|
@@ -15419,7 +15438,7 @@ function limitToFilter(){
|
|
15419
15438
|
* Example:
|
15420
15439
|
*
|
15421
15440
|
* @example
|
15422
|
-
<example>
|
15441
|
+
<example module="orderByExample">
|
15423
15442
|
<file name="index.html">
|
15424
15443
|
<div ng-controller="Ctrl">
|
15425
15444
|
<table class="friend">
|
@@ -15439,21 +15458,21 @@ function limitToFilter(){
|
|
15439
15458
|
</file>
|
15440
15459
|
|
15441
15460
|
<file name="script.js">
|
15442
|
-
|
15443
|
-
|
15444
|
-
|
15445
|
-
|
15446
|
-
|
15447
|
-
|
15448
|
-
|
15449
|
-
|
15450
|
-
|
15451
|
-
|
15452
|
-
|
15453
|
-
|
15454
|
-
|
15455
|
-
|
15456
|
-
|
15461
|
+
angular.module('orderByExample', [])
|
15462
|
+
.controller('ExampleController', ['$scope', '$filter', function($scope, $filter) {
|
15463
|
+
var orderBy = $filter('orderBy');
|
15464
|
+
$scope.friends = [
|
15465
|
+
{ name: 'John', phone: '555-1212', age: 10 },
|
15466
|
+
{ name: 'Mary', phone: '555-9876', age: 19 },
|
15467
|
+
{ name: 'Mike', phone: '555-4321', age: 21 },
|
15468
|
+
{ name: 'Adam', phone: '555-5678', age: 35 },
|
15469
|
+
{ name: 'Julie', phone: '555-8765', age: 29 }
|
15470
|
+
];
|
15471
|
+
$scope.order = function(predicate, reverse) {
|
15472
|
+
$scope.friends = orderBy($scope.friends, predicate, reverse);
|
15473
|
+
};
|
15474
|
+
$scope.order('-age',false);
|
15475
|
+
}]);
|
15457
15476
|
</file>
|
15458
15477
|
</example>
|
15459
15478
|
*/
|
@@ -15639,7 +15658,7 @@ var htmlAnchorDirective = valueFn({
|
|
15639
15658
|
return browser.driver.getCurrentUrl().then(function(url) {
|
15640
15659
|
return url.match(/\/123$/);
|
15641
15660
|
});
|
15642
|
-
},
|
15661
|
+
}, 5000, 'page should navigate to /123');
|
15643
15662
|
});
|
15644
15663
|
|
15645
15664
|
xit('should execute ng-click but not reload when href empty string and name specified', function() {
|
@@ -15667,7 +15686,7 @@ var htmlAnchorDirective = valueFn({
|
|
15667
15686
|
return browser.driver.getCurrentUrl().then(function(url) {
|
15668
15687
|
return url.match(/\/6$/);
|
15669
15688
|
});
|
15670
|
-
},
|
15689
|
+
}, 5000, 'page should navigate to /6');
|
15671
15690
|
});
|
15672
15691
|
</file>
|
15673
15692
|
</example>
|
@@ -16283,12 +16302,13 @@ function FormController(element, attrs, $scope, $animate) {
|
|
16283
16302
|
* </pre>
|
16284
16303
|
*
|
16285
16304
|
* @example
|
16286
|
-
<example deps="angular-animate.js" animations="true" fixBase="true">
|
16305
|
+
<example deps="angular-animate.js" animations="true" fixBase="true" module="formExample">
|
16287
16306
|
<file name="index.html">
|
16288
16307
|
<script>
|
16289
|
-
|
16290
|
-
$scope
|
16291
|
-
|
16308
|
+
angular.module('formExample', [])
|
16309
|
+
.controller('FormController', ['$scope', function($scope) {
|
16310
|
+
$scope.userType = 'guest';
|
16311
|
+
}]);
|
16292
16312
|
</script>
|
16293
16313
|
<style>
|
16294
16314
|
.my-form {
|
@@ -16300,7 +16320,7 @@ function FormController(element, attrs, $scope, $animate) {
|
|
16300
16320
|
background: red;
|
16301
16321
|
}
|
16302
16322
|
</style>
|
16303
|
-
<form name="myForm" ng-controller="
|
16323
|
+
<form name="myForm" ng-controller="FormController" class="my-form">
|
16304
16324
|
userType: <input name="input" ng-model="userType" required>
|
16305
16325
|
<span class="error" ng-show="myForm.input.$error.required">Required!</span><br>
|
16306
16326
|
<tt>userType = {{userType}}</tt><br>
|
@@ -16403,7 +16423,7 @@ var ngFormDirective = formDirectiveFactory(true);
|
|
16403
16423
|
*/
|
16404
16424
|
|
16405
16425
|
var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
|
16406
|
-
var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9-]
|
16426
|
+
var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i;
|
16407
16427
|
var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/;
|
16408
16428
|
|
16409
16429
|
var inputType = {
|
@@ -16433,15 +16453,16 @@ var inputType = {
|
|
16433
16453
|
* @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.
|
16434
16454
|
*
|
16435
16455
|
* @example
|
16436
|
-
<example name="text-input-directive">
|
16456
|
+
<example name="text-input-directive" module="textInputExample">
|
16437
16457
|
<file name="index.html">
|
16438
16458
|
<script>
|
16439
|
-
|
16440
|
-
$scope
|
16441
|
-
|
16442
|
-
|
16459
|
+
angular.module('textInputExample', [])
|
16460
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
16461
|
+
$scope.text = 'guest';
|
16462
|
+
$scope.word = /^\s*\w*\s*$/;
|
16463
|
+
}]);
|
16443
16464
|
</script>
|
16444
|
-
<form name="myForm" ng-controller="
|
16465
|
+
<form name="myForm" ng-controller="ExampleController">
|
16445
16466
|
Single word: <input type="text" name="input" ng-model="text"
|
16446
16467
|
ng-pattern="word" required ng-trim="false">
|
16447
16468
|
<span class="error" ng-show="myForm.input.$error.required">
|
@@ -16513,14 +16534,15 @@ var inputType = {
|
|
16513
16534
|
* interaction with the input element.
|
16514
16535
|
*
|
16515
16536
|
* @example
|
16516
|
-
<example name="number-input-directive">
|
16537
|
+
<example name="number-input-directive" module="numberExample">
|
16517
16538
|
<file name="index.html">
|
16518
16539
|
<script>
|
16519
|
-
|
16520
|
-
$scope
|
16521
|
-
|
16540
|
+
angular.module('numberExample', [])
|
16541
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
16542
|
+
$scope.value = 12;
|
16543
|
+
}]);
|
16522
16544
|
</script>
|
16523
|
-
<form name="myForm" ng-controller="
|
16545
|
+
<form name="myForm" ng-controller="ExampleController">
|
16524
16546
|
Number: <input type="number" name="input" ng-model="value"
|
16525
16547
|
min="0" max="99" required>
|
16526
16548
|
<span class="error" ng-show="myForm.input.$error.required">
|
@@ -16588,14 +16610,15 @@ var inputType = {
|
|
16588
16610
|
* interaction with the input element.
|
16589
16611
|
*
|
16590
16612
|
* @example
|
16591
|
-
<example name="url-input-directive">
|
16613
|
+
<example name="url-input-directive" module="urlExample">
|
16592
16614
|
<file name="index.html">
|
16593
16615
|
<script>
|
16594
|
-
|
16595
|
-
$scope
|
16596
|
-
|
16616
|
+
angular.module('urlExample', [])
|
16617
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
16618
|
+
$scope.text = 'http://google.com';
|
16619
|
+
}]);
|
16597
16620
|
</script>
|
16598
|
-
<form name="myForm" ng-controller="
|
16621
|
+
<form name="myForm" ng-controller="ExampleController">
|
16599
16622
|
URL: <input type="url" name="input" ng-model="text" required>
|
16600
16623
|
<span class="error" ng-show="myForm.input.$error.required">
|
16601
16624
|
Required!</span>
|
@@ -16664,14 +16687,15 @@ var inputType = {
|
|
16664
16687
|
* interaction with the input element.
|
16665
16688
|
*
|
16666
16689
|
* @example
|
16667
|
-
<example name="email-input-directive">
|
16690
|
+
<example name="email-input-directive" module="emailExample">
|
16668
16691
|
<file name="index.html">
|
16669
16692
|
<script>
|
16670
|
-
|
16671
|
-
$scope
|
16672
|
-
|
16693
|
+
angular.module('emailExample', [])
|
16694
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
16695
|
+
$scope.text = 'me@example.com';
|
16696
|
+
}]);
|
16673
16697
|
</script>
|
16674
|
-
<form name="myForm" ng-controller="
|
16698
|
+
<form name="myForm" ng-controller="ExampleController">
|
16675
16699
|
Email: <input type="email" name="input" ng-model="text" required>
|
16676
16700
|
<span class="error" ng-show="myForm.input.$error.required">
|
16677
16701
|
Required!</span>
|
@@ -16730,18 +16754,19 @@ var inputType = {
|
|
16730
16754
|
* be set when selected.
|
16731
16755
|
*
|
16732
16756
|
* @example
|
16733
|
-
<example name="radio-input-directive">
|
16757
|
+
<example name="radio-input-directive" module="radioExample">
|
16734
16758
|
<file name="index.html">
|
16735
16759
|
<script>
|
16736
|
-
|
16737
|
-
$scope
|
16738
|
-
|
16739
|
-
|
16740
|
-
|
16741
|
-
|
16742
|
-
|
16760
|
+
angular.module('radioExample', [])
|
16761
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
16762
|
+
$scope.color = 'blue';
|
16763
|
+
$scope.specialValue = {
|
16764
|
+
"id": "12345",
|
16765
|
+
"value": "green"
|
16766
|
+
};
|
16767
|
+
}]);
|
16743
16768
|
</script>
|
16744
|
-
<form name="myForm" ng-controller="
|
16769
|
+
<form name="myForm" ng-controller="ExampleController">
|
16745
16770
|
<input type="radio" ng-model="color" value="red"> Red <br/>
|
16746
16771
|
<input type="radio" ng-model="color" ng-value="specialValue"> Green <br/>
|
16747
16772
|
<input type="radio" ng-model="color" value="blue"> Blue <br/>
|
@@ -16780,15 +16805,16 @@ var inputType = {
|
|
16780
16805
|
* interaction with the input element.
|
16781
16806
|
*
|
16782
16807
|
* @example
|
16783
|
-
<example name="checkbox-input-directive">
|
16808
|
+
<example name="checkbox-input-directive" module="checkboxExample">
|
16784
16809
|
<file name="index.html">
|
16785
16810
|
<script>
|
16786
|
-
|
16787
|
-
$scope
|
16788
|
-
|
16789
|
-
|
16811
|
+
angular.module('checkboxExample', [])
|
16812
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
16813
|
+
$scope.value1 = true;
|
16814
|
+
$scope.value2 = 'YES'
|
16815
|
+
}]);
|
16790
16816
|
</script>
|
16791
|
-
<form name="myForm" ng-controller="
|
16817
|
+
<form name="myForm" ng-controller="ExampleController">
|
16792
16818
|
Value1: <input type="checkbox" ng-model="value1"> <br/>
|
16793
16819
|
Value2: <input type="checkbox" ng-model="value2"
|
16794
16820
|
ng-true-value="YES" ng-false-value="NO"> <br/>
|
@@ -17188,14 +17214,15 @@ function checkboxInputType(scope, element, attr, ctrl) {
|
|
17188
17214
|
* interaction with the input element.
|
17189
17215
|
*
|
17190
17216
|
* @example
|
17191
|
-
<example name="input-directive">
|
17217
|
+
<example name="input-directive" module="inputExample">
|
17192
17218
|
<file name="index.html">
|
17193
17219
|
<script>
|
17194
|
-
|
17195
|
-
|
17196
|
-
|
17220
|
+
angular.module('inputExample', [])
|
17221
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
17222
|
+
$scope.user = {name: 'guest', last: 'visitor'};
|
17223
|
+
}]);
|
17197
17224
|
</script>
|
17198
|
-
<div ng-controller="
|
17225
|
+
<div ng-controller="ExampleController">
|
17199
17226
|
<form name="myForm">
|
17200
17227
|
User name: <input type="text" name="userName" ng-model="user.name" required>
|
17201
17228
|
<span class="error" ng-show="myForm.userName.$error.required">
|
@@ -17713,12 +17740,13 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
17713
17740
|
* </pre>
|
17714
17741
|
*
|
17715
17742
|
* @example
|
17716
|
-
* <example deps="angular-animate.js" animations="true" fixBase="true">
|
17743
|
+
* <example deps="angular-animate.js" animations="true" fixBase="true" module="inputExample">
|
17717
17744
|
<file name="index.html">
|
17718
17745
|
<script>
|
17719
|
-
|
17720
|
-
$scope
|
17721
|
-
|
17746
|
+
angular.module('inputExample', [])
|
17747
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
17748
|
+
$scope.val = '1';
|
17749
|
+
}]);
|
17722
17750
|
</script>
|
17723
17751
|
<style>
|
17724
17752
|
.my-input {
|
@@ -17733,7 +17761,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
17733
17761
|
</style>
|
17734
17762
|
Update input to see transitions when valid/invalid.
|
17735
17763
|
Integer is a valid value.
|
17736
|
-
<form name="testForm" ng-controller="
|
17764
|
+
<form name="testForm" ng-controller="ExampleController">
|
17737
17765
|
<input ng-model="val" ng-pattern="/^\d+$/" name="anim" class="my-input" />
|
17738
17766
|
</form>
|
17739
17767
|
</file>
|
@@ -17777,17 +17805,18 @@ var ngModelDirective = function() {
|
|
17777
17805
|
* in input value.
|
17778
17806
|
*
|
17779
17807
|
* @example
|
17780
|
-
* <example name="ngChange-directive">
|
17808
|
+
* <example name="ngChange-directive" module="changeExample">
|
17781
17809
|
* <file name="index.html">
|
17782
17810
|
* <script>
|
17783
|
-
*
|
17784
|
-
* $scope
|
17785
|
-
*
|
17786
|
-
* $scope.
|
17787
|
-
*
|
17788
|
-
*
|
17811
|
+
* angular.module('changeExample', [])
|
17812
|
+
* .controller('ExampleController', ['$scope', function($scope) {
|
17813
|
+
* $scope.counter = 0;
|
17814
|
+
* $scope.change = function() {
|
17815
|
+
* $scope.counter++;
|
17816
|
+
* };
|
17817
|
+
* }]);
|
17789
17818
|
* </script>
|
17790
|
-
* <div ng-controller="
|
17819
|
+
* <div ng-controller="ExampleController">
|
17791
17820
|
* <input type="checkbox" ng-model="confirmed" ng-change="change()" id="ng-change-example1" />
|
17792
17821
|
* <input type="checkbox" ng-model="confirmed" id="ng-change-example2" />
|
17793
17822
|
* <label for="ng-change-example2">Confirmed</label><br />
|
@@ -17868,14 +17897,15 @@ var requiredDirective = function() {
|
|
17868
17897
|
* specified in form `/something/` then the value will be converted into a regular expression.
|
17869
17898
|
*
|
17870
17899
|
* @example
|
17871
|
-
<example name="ngList-directive">
|
17900
|
+
<example name="ngList-directive" module="listExample">
|
17872
17901
|
<file name="index.html">
|
17873
17902
|
<script>
|
17874
|
-
|
17875
|
-
|
17876
|
-
|
17903
|
+
angular.module('listExample', [])
|
17904
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
17905
|
+
$scope.names = ['igor', 'misko', 'vojta'];
|
17906
|
+
}]);
|
17877
17907
|
</script>
|
17878
|
-
<form name="myForm" ng-controller="
|
17908
|
+
<form name="myForm" ng-controller="ExampleController">
|
17879
17909
|
List: <input name="namesInput" ng-model="names" ng-list required>
|
17880
17910
|
<span class="error" ng-show="myForm.namesInput.$error.required">
|
17881
17911
|
Required!</span>
|
@@ -17967,15 +17997,16 @@ var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/;
|
|
17967
17997
|
* of the `input` element
|
17968
17998
|
*
|
17969
17999
|
* @example
|
17970
|
-
<example name="ngValue-directive">
|
18000
|
+
<example name="ngValue-directive" module="valueExample">
|
17971
18001
|
<file name="index.html">
|
17972
18002
|
<script>
|
17973
|
-
|
17974
|
-
|
17975
|
-
|
17976
|
-
|
18003
|
+
angular.module('valueExample', [])
|
18004
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
18005
|
+
$scope.names = ['pizza', 'unicorns', 'robots'];
|
18006
|
+
$scope.my = { favorite: 'unicorns' };
|
18007
|
+
}]);
|
17977
18008
|
</script>
|
17978
|
-
<form ng-controller="
|
18009
|
+
<form ng-controller="ExampleController">
|
17979
18010
|
<h2>Which is your favorite?</h2>
|
17980
18011
|
<label ng-repeat="name in names" for="{{name}}">
|
17981
18012
|
{{name}}
|
@@ -18046,14 +18077,15 @@ var ngValueDirective = function() {
|
|
18046
18077
|
*
|
18047
18078
|
* @example
|
18048
18079
|
* Enter a name in the Live Preview text box; the greeting below the text box changes instantly.
|
18049
|
-
<example>
|
18080
|
+
<example module="bindExample">
|
18050
18081
|
<file name="index.html">
|
18051
18082
|
<script>
|
18052
|
-
|
18053
|
-
$scope
|
18054
|
-
|
18083
|
+
angular.module('bindExample', [])
|
18084
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
18085
|
+
$scope.name = 'Whirled';
|
18086
|
+
}]);
|
18055
18087
|
</script>
|
18056
|
-
<div ng-controller="
|
18088
|
+
<div ng-controller="ExampleController">
|
18057
18089
|
Enter name: <input type="text" ng-model="name"><br>
|
18058
18090
|
Hello <span ng-bind="name"></span>!
|
18059
18091
|
</div>
|
@@ -18104,15 +18136,16 @@ var ngBindDirective = ngDirective({
|
|
18104
18136
|
*
|
18105
18137
|
* @example
|
18106
18138
|
* Try it here: enter text in text box and watch the greeting change.
|
18107
|
-
<example>
|
18139
|
+
<example module="bindExample">
|
18108
18140
|
<file name="index.html">
|
18109
18141
|
<script>
|
18110
|
-
|
18111
|
-
$scope
|
18112
|
-
|
18113
|
-
|
18142
|
+
angular.module('bindExample', [])
|
18143
|
+
.controller('ExampleController', ['$scope', function ($scope) {
|
18144
|
+
$scope.salutation = 'Hello';
|
18145
|
+
$scope.name = 'World';
|
18146
|
+
}]);
|
18114
18147
|
</script>
|
18115
|
-
<div ng-controller="
|
18148
|
+
<div ng-controller="ExampleController">
|
18116
18149
|
Salutation: <input type="text" ng-model="salutation"><br>
|
18117
18150
|
Name: <input type="text" ng-model="name"><br>
|
18118
18151
|
<pre ng-bind-template="{{salutation}} {{name}}!"></pre>
|
@@ -18170,20 +18203,20 @@ var ngBindTemplateDirective = ['$interpolate', function($interpolate) {
|
|
18170
18203
|
* @example
|
18171
18204
|
Try it here: enter text in text box and watch the greeting change.
|
18172
18205
|
|
18173
|
-
<example module="
|
18206
|
+
<example module="bindHtmlExample" deps="angular-sanitize.js">
|
18174
18207
|
<file name="index.html">
|
18175
|
-
<div ng-controller="
|
18208
|
+
<div ng-controller="ExampleController">
|
18176
18209
|
<p ng-bind-html="myHTML"></p>
|
18177
18210
|
</div>
|
18178
18211
|
</file>
|
18179
18212
|
|
18180
18213
|
<file name="script.js">
|
18181
|
-
angular.module('
|
18182
|
-
|
18183
|
-
|
18184
|
-
|
18185
|
-
|
18186
|
-
|
18214
|
+
angular.module('bindHtmlExample', ['ngSanitize'])
|
18215
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
18216
|
+
$scope.myHTML =
|
18217
|
+
'I am an <code>HTML</code>string with ' +
|
18218
|
+
'<a href="#">links!</a> and other <em>stuff</em>';
|
18219
|
+
}]);
|
18187
18220
|
</file>
|
18188
18221
|
|
18189
18222
|
<file name="protractor.js" type="protractor">
|
@@ -18682,7 +18715,7 @@ var ngCloakDirective = ngDirective({
|
|
18682
18715
|
*
|
18683
18716
|
* This example demonstrates the `controller as` syntax.
|
18684
18717
|
*
|
18685
|
-
* <example name="ngControllerAs">
|
18718
|
+
* <example name="ngControllerAs" module="controllerAsExample">
|
18686
18719
|
* <file name="index.html">
|
18687
18720
|
* <div id="ctrl-as-exmpl" ng-controller="SettingsController1 as settings">
|
18688
18721
|
* Name: <input type="text" ng-model="settings.name"/>
|
@@ -18703,6 +18736,9 @@ var ngCloakDirective = ngDirective({
|
|
18703
18736
|
* </div>
|
18704
18737
|
* </file>
|
18705
18738
|
* <file name="app.js">
|
18739
|
+
* angular.module('controllerAsExample', [])
|
18740
|
+
* .controller('SettingsController1', SettingsController1);
|
18741
|
+
*
|
18706
18742
|
* function SettingsController1() {
|
18707
18743
|
* this.name = "John Smith";
|
18708
18744
|
* this.contacts = [
|
@@ -18731,29 +18767,29 @@ var ngCloakDirective = ngDirective({
|
|
18731
18767
|
* <file name="protractor.js" type="protractor">
|
18732
18768
|
* it('should check controller as', function() {
|
18733
18769
|
* var container = element(by.id('ctrl-as-exmpl'));
|
18734
|
-
* expect(container.
|
18770
|
+
* expect(container.element(by.model('settings.name'))
|
18735
18771
|
* .getAttribute('value')).toBe('John Smith');
|
18736
18772
|
*
|
18737
18773
|
* var firstRepeat =
|
18738
|
-
* container.
|
18774
|
+
* container.element(by.repeater('contact in settings.contacts').row(0));
|
18739
18775
|
* var secondRepeat =
|
18740
|
-
* container.
|
18776
|
+
* container.element(by.repeater('contact in settings.contacts').row(1));
|
18741
18777
|
*
|
18742
|
-
* expect(firstRepeat.
|
18778
|
+
* expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))
|
18743
18779
|
* .toBe('408 555 1212');
|
18744
18780
|
*
|
18745
|
-
* expect(secondRepeat.
|
18781
|
+
* expect(secondRepeat.element(by.model('contact.value')).getAttribute('value'))
|
18746
18782
|
* .toBe('john.smith@example.org');
|
18747
18783
|
*
|
18748
|
-
* firstRepeat.
|
18784
|
+
* firstRepeat.element(by.linkText('clear')).click();
|
18749
18785
|
*
|
18750
|
-
* expect(firstRepeat.
|
18786
|
+
* expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))
|
18751
18787
|
* .toBe('');
|
18752
18788
|
*
|
18753
|
-
* container.
|
18789
|
+
* container.element(by.linkText('add')).click();
|
18754
18790
|
*
|
18755
|
-
* expect(container.
|
18756
|
-
* .
|
18791
|
+
* expect(container.element(by.repeater('contact in settings.contacts').row(2))
|
18792
|
+
* .element(by.model('contact.value'))
|
18757
18793
|
* .getAttribute('value'))
|
18758
18794
|
* .toBe('yourname@example.org');
|
18759
18795
|
* });
|
@@ -18762,7 +18798,7 @@ var ngCloakDirective = ngDirective({
|
|
18762
18798
|
*
|
18763
18799
|
* This example demonstrates the "attach to `$scope`" style of controller.
|
18764
18800
|
*
|
18765
|
-
* <example name="ngController">
|
18801
|
+
* <example name="ngController" module="controllerExample">
|
18766
18802
|
* <file name="index.html">
|
18767
18803
|
* <div id="ctrl-exmpl" ng-controller="SettingsController2">
|
18768
18804
|
* Name: <input type="text" ng-model="name"/>
|
@@ -18783,6 +18819,9 @@ var ngCloakDirective = ngDirective({
|
|
18783
18819
|
* </div>
|
18784
18820
|
* </file>
|
18785
18821
|
* <file name="app.js">
|
18822
|
+
* angular.module('controllerExample', [])
|
18823
|
+
* .controller('SettingsController2', ['$scope', SettingsController2]);
|
18824
|
+
*
|
18786
18825
|
* function SettingsController2($scope) {
|
18787
18826
|
* $scope.name = "John Smith";
|
18788
18827
|
* $scope.contacts = [
|
@@ -18812,28 +18851,28 @@ var ngCloakDirective = ngDirective({
|
|
18812
18851
|
* it('should check controller', function() {
|
18813
18852
|
* var container = element(by.id('ctrl-exmpl'));
|
18814
18853
|
*
|
18815
|
-
* expect(container.
|
18854
|
+
* expect(container.element(by.model('name'))
|
18816
18855
|
* .getAttribute('value')).toBe('John Smith');
|
18817
18856
|
*
|
18818
18857
|
* var firstRepeat =
|
18819
|
-
* container.
|
18858
|
+
* container.element(by.repeater('contact in contacts').row(0));
|
18820
18859
|
* var secondRepeat =
|
18821
|
-
* container.
|
18860
|
+
* container.element(by.repeater('contact in contacts').row(1));
|
18822
18861
|
*
|
18823
|
-
* expect(firstRepeat.
|
18862
|
+
* expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))
|
18824
18863
|
* .toBe('408 555 1212');
|
18825
|
-
* expect(secondRepeat.
|
18864
|
+
* expect(secondRepeat.element(by.model('contact.value')).getAttribute('value'))
|
18826
18865
|
* .toBe('john.smith@example.org');
|
18827
18866
|
*
|
18828
|
-
* firstRepeat.
|
18867
|
+
* firstRepeat.element(by.linkText('clear')).click();
|
18829
18868
|
*
|
18830
|
-
* expect(firstRepeat.
|
18869
|
+
* expect(firstRepeat.element(by.model('contact.value')).getAttribute('value'))
|
18831
18870
|
* .toBe('');
|
18832
18871
|
*
|
18833
|
-
* container.
|
18872
|
+
* container.element(by.linkText('add')).click();
|
18834
18873
|
*
|
18835
|
-
* expect(container.
|
18836
|
-
* .
|
18874
|
+
* expect(container.element(by.repeater('contact in contacts').row(2))
|
18875
|
+
* .element(by.model('contact.value'))
|
18837
18876
|
* .getAttribute('value'))
|
18838
18877
|
* .toBe('yourname@example.org');
|
18839
18878
|
* });
|
@@ -19204,21 +19243,22 @@ forEach(
|
|
19204
19243
|
* ({@link guide/expression#-event- Event object is available as `$event`})
|
19205
19244
|
*
|
19206
19245
|
* @example
|
19207
|
-
<example>
|
19246
|
+
<example module="submitExample">
|
19208
19247
|
<file name="index.html">
|
19209
19248
|
<script>
|
19210
|
-
|
19211
|
-
$scope
|
19212
|
-
|
19213
|
-
|
19214
|
-
|
19215
|
-
$scope.
|
19216
|
-
|
19217
|
-
|
19218
|
-
|
19219
|
-
|
19249
|
+
angular.module('submitExample', [])
|
19250
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
19251
|
+
$scope.list = [];
|
19252
|
+
$scope.text = 'hello';
|
19253
|
+
$scope.submit = function() {
|
19254
|
+
if ($scope.text) {
|
19255
|
+
$scope.list.push(this.text);
|
19256
|
+
$scope.text = '';
|
19257
|
+
}
|
19258
|
+
};
|
19259
|
+
}]);
|
19220
19260
|
</script>
|
19221
|
-
<form ng-submit="submit()" ng-controller="
|
19261
|
+
<form ng-submit="submit()" ng-controller="ExampleController">
|
19222
19262
|
Enter text and hit enter:
|
19223
19263
|
<input type="text" ng-model="text" name="text" />
|
19224
19264
|
<input type="submit" id="submit" value="Submit" />
|
@@ -19230,7 +19270,7 @@ forEach(
|
|
19230
19270
|
expect(element(by.binding('list')).getText()).toBe('list=[]');
|
19231
19271
|
element(by.css('#submit')).click();
|
19232
19272
|
expect(element(by.binding('list')).getText()).toContain('hello');
|
19233
|
-
expect(element(by.
|
19273
|
+
expect(element(by.model('text')).getAttribute('value')).toBe('');
|
19234
19274
|
});
|
19235
19275
|
it('should ignore empty strings', function() {
|
19236
19276
|
expect(element(by.binding('list')).getText()).toBe('list=[]');
|
@@ -19503,9 +19543,9 @@ var ngIfDirective = ['$animate', function($animate) {
|
|
19503
19543
|
* - Otherwise enable scrolling only if the expression evaluates to truthy value.
|
19504
19544
|
*
|
19505
19545
|
* @example
|
19506
|
-
<example module="
|
19546
|
+
<example module="includeExample" deps="angular-animate.js" animations="true">
|
19507
19547
|
<file name="index.html">
|
19508
|
-
<div ng-controller="
|
19548
|
+
<div ng-controller="ExampleController">
|
19509
19549
|
<select ng-model="template" ng-options="t.name for t in templates">
|
19510
19550
|
<option value="">(blank)</option>
|
19511
19551
|
</select>
|
@@ -19517,12 +19557,13 @@ var ngIfDirective = ['$animate', function($animate) {
|
|
19517
19557
|
</div>
|
19518
19558
|
</file>
|
19519
19559
|
<file name="script.js">
|
19520
|
-
|
19521
|
-
$scope
|
19522
|
-
|
19523
|
-
{ name: '
|
19524
|
-
|
19525
|
-
|
19560
|
+
angular.module('includeExample', ['ngAnimate'])
|
19561
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
19562
|
+
$scope.templates =
|
19563
|
+
[ { name: 'template1.html', url: 'template1.html'},
|
19564
|
+
{ name: 'template2.html', url: 'template2.html'} ];
|
19565
|
+
$scope.template = $scope.templates[0];
|
19566
|
+
}]);
|
19526
19567
|
</file>
|
19527
19568
|
<file name="template1.html">
|
19528
19569
|
Content of template1.html
|
@@ -19585,7 +19626,7 @@ var ngIfDirective = ['$animate', function($animate) {
|
|
19585
19626
|
return;
|
19586
19627
|
}
|
19587
19628
|
templateSelect.click();
|
19588
|
-
templateSelect.
|
19629
|
+
templateSelect.all(by.css('option')).get(2).click();
|
19589
19630
|
expect(includeElem.getText()).toMatch(/Content of template2.html/);
|
19590
19631
|
});
|
19591
19632
|
|
@@ -19595,7 +19636,7 @@ var ngIfDirective = ['$animate', function($animate) {
|
|
19595
19636
|
return;
|
19596
19637
|
}
|
19597
19638
|
templateSelect.click();
|
19598
|
-
templateSelect.
|
19639
|
+
templateSelect.all(by.css('option')).get(0).click();
|
19599
19640
|
expect(includeElem.isPresent()).toBe(false);
|
19600
19641
|
});
|
19601
19642
|
</file>
|
@@ -19747,14 +19788,15 @@ var ngIncludeFillContentDirective = ['$compile',
|
|
19747
19788
|
* @param {expression} ngInit {@link guide/expression Expression} to eval.
|
19748
19789
|
*
|
19749
19790
|
* @example
|
19750
|
-
<example>
|
19791
|
+
<example module="initExample">
|
19751
19792
|
<file name="index.html">
|
19752
19793
|
<script>
|
19753
|
-
|
19754
|
-
|
19755
|
-
|
19794
|
+
angular.module('initExample', [])
|
19795
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
19796
|
+
$scope.list = [['a', 'b'], ['c', 'd']];
|
19797
|
+
}]);
|
19756
19798
|
</script>
|
19757
|
-
<div ng-controller="
|
19799
|
+
<div ng-controller="ExampleController">
|
19758
19800
|
<div ng-repeat="innerList in list" ng-init="outerIndex = $index">
|
19759
19801
|
<div ng-repeat="value in innerList" ng-init="innerIndex = $index">
|
19760
19802
|
<span class="example-init">list[ {{outerIndex}} ][ {{innerIndex}} ] = {{value}};</span>
|
@@ -19907,16 +19949,17 @@ var ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });
|
|
19907
19949
|
* @param {number=} offset Offset to deduct from the total number.
|
19908
19950
|
*
|
19909
19951
|
* @example
|
19910
|
-
<example>
|
19952
|
+
<example module="pluralizeExample">
|
19911
19953
|
<file name="index.html">
|
19912
19954
|
<script>
|
19913
|
-
|
19914
|
-
$scope
|
19915
|
-
|
19916
|
-
|
19917
|
-
|
19955
|
+
angular.module('pluralizeExample', [])
|
19956
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
19957
|
+
$scope.person1 = 'Igor';
|
19958
|
+
$scope.person2 = 'Misko';
|
19959
|
+
$scope.personCount = 1;
|
19960
|
+
}]);
|
19918
19961
|
</script>
|
19919
|
-
<div ng-controller="
|
19962
|
+
<div ng-controller="ExampleController">
|
19920
19963
|
Person 1:<input type="text" ng-model="person1" value="Igor" /><br/>
|
19921
19964
|
Person 2:<input type="text" ng-model="person2" value="Misko" /><br/>
|
19922
19965
|
Number of People:<input type="text" ng-model="personCount" value="1" /><br/>
|
@@ -20850,9 +20893,9 @@ var ngStyleDirective = ngDirective(function(scope, element, attr) {
|
|
20850
20893
|
*
|
20851
20894
|
*
|
20852
20895
|
* @example
|
20853
|
-
<example module="
|
20896
|
+
<example module="switchExample" deps="angular-animate.js" animations="true">
|
20854
20897
|
<file name="index.html">
|
20855
|
-
<div ng-controller="
|
20898
|
+
<div ng-controller="ExampleController">
|
20856
20899
|
<select ng-model="selection" ng-options="item for item in items">
|
20857
20900
|
</select>
|
20858
20901
|
<tt>selection={{selection}}</tt>
|
@@ -20866,10 +20909,11 @@ var ngStyleDirective = ngDirective(function(scope, element, attr) {
|
|
20866
20909
|
</div>
|
20867
20910
|
</file>
|
20868
20911
|
<file name="script.js">
|
20869
|
-
|
20870
|
-
|
20871
|
-
|
20872
|
-
|
20912
|
+
angular.module('switchExample', ['ngAnimate'])
|
20913
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
20914
|
+
$scope.items = ['settings', 'home', 'other'];
|
20915
|
+
$scope.selection = $scope.items[0];
|
20916
|
+
}]);
|
20873
20917
|
</file>
|
20874
20918
|
<file name="animations.css">
|
20875
20919
|
.animate-switch-container {
|
@@ -20912,11 +20956,11 @@ var ngStyleDirective = ngDirective(function(scope, element, attr) {
|
|
20912
20956
|
expect(switchElem.getText()).toMatch(/Settings Div/);
|
20913
20957
|
});
|
20914
20958
|
it('should change to home', function() {
|
20915
|
-
select.
|
20959
|
+
select.all(by.css('option')).get(1).click();
|
20916
20960
|
expect(switchElem.getText()).toMatch(/Home Span/);
|
20917
20961
|
});
|
20918
20962
|
it('should select default', function() {
|
20919
|
-
select.
|
20963
|
+
select.all(by.css('option')).get(2).click();
|
20920
20964
|
expect(switchElem.getText()).toMatch(/default/);
|
20921
20965
|
});
|
20922
20966
|
</file>
|
@@ -21008,15 +21052,10 @@ var ngSwitchDefaultDirective = ngDirective({
|
|
21008
21052
|
* @element ANY
|
21009
21053
|
*
|
21010
21054
|
* @example
|
21011
|
-
<example module="
|
21055
|
+
<example module="transcludeExample">
|
21012
21056
|
<file name="index.html">
|
21013
21057
|
<script>
|
21014
|
-
|
21015
|
-
$scope.title = 'Lorem Ipsum';
|
21016
|
-
$scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';
|
21017
|
-
}
|
21018
|
-
|
21019
|
-
angular.module('transclude', [])
|
21058
|
+
angular.module('transcludeExample', [])
|
21020
21059
|
.directive('pane', function(){
|
21021
21060
|
return {
|
21022
21061
|
restrict: 'E',
|
@@ -21027,9 +21066,13 @@ var ngSwitchDefaultDirective = ngDirective({
|
|
21027
21066
|
'<div ng-transclude></div>' +
|
21028
21067
|
'</div>'
|
21029
21068
|
};
|
21030
|
-
})
|
21069
|
+
})
|
21070
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
21071
|
+
$scope.title = 'Lorem Ipsum';
|
21072
|
+
$scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';
|
21073
|
+
}]);
|
21031
21074
|
</script>
|
21032
|
-
<div ng-controller="
|
21075
|
+
<div ng-controller="ExampleController">
|
21033
21076
|
<input ng-model="title"><br>
|
21034
21077
|
<textarea ng-model="text"></textarea> <br/>
|
21035
21078
|
<pane title="{{title}}">{{text}}</pane>
|
@@ -21188,21 +21231,22 @@ var ngOptionsMinErr = minErr('ngOptions');
|
|
21188
21231
|
* `value` variable (e.g. `value.propertyName`).
|
21189
21232
|
*
|
21190
21233
|
* @example
|
21191
|
-
<example>
|
21234
|
+
<example module="selectExample">
|
21192
21235
|
<file name="index.html">
|
21193
21236
|
<script>
|
21194
|
-
|
21195
|
-
$scope
|
21196
|
-
|
21197
|
-
|
21198
|
-
|
21199
|
-
|
21200
|
-
|
21201
|
-
|
21202
|
-
|
21203
|
-
|
21237
|
+
angular.module('selectExample', [])
|
21238
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
21239
|
+
$scope.colors = [
|
21240
|
+
{name:'black', shade:'dark'},
|
21241
|
+
{name:'white', shade:'light'},
|
21242
|
+
{name:'red', shade:'dark'},
|
21243
|
+
{name:'blue', shade:'dark'},
|
21244
|
+
{name:'yellow', shade:'light'}
|
21245
|
+
];
|
21246
|
+
$scope.myColor = $scope.colors[2]; // red
|
21247
|
+
}]);
|
21204
21248
|
</script>
|
21205
|
-
<div ng-controller="
|
21249
|
+
<div ng-controller="ExampleController">
|
21206
21250
|
<ul>
|
21207
21251
|
<li ng-repeat="color in colors">
|
21208
21252
|
Name: <input ng-model="color.name">
|
@@ -21239,7 +21283,7 @@ var ngOptionsMinErr = minErr('ngOptions');
|
|
21239
21283
|
<file name="protractor.js" type="protractor">
|
21240
21284
|
it('should check ng-options', function() {
|
21241
21285
|
expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('red');
|
21242
|
-
element.all(by.
|
21286
|
+
element.all(by.model('myColor')).first().click();
|
21243
21287
|
element.all(by.css('select[ng-model="myColor"] option')).first().click();
|
21244
21288
|
expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('black');
|
21245
21289
|
element(by.css('.nullable select[ng-model="myColor"]')).click();
|