angularjs-rails 1.2.19 → 1.2.20
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.
- checksums.yaml +4 -4
- data/lib/angularjs-rails/version.rb +2 -2
- 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
- data/vendor/assets/javascripts/unstable/angular-animate.js +118 -41
- data/vendor/assets/javascripts/unstable/angular-cookies.js +17 -15
- data/vendor/assets/javascripts/unstable/angular-loader.js +2 -2
- data/vendor/assets/javascripts/unstable/angular-messages.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-mocks.js +2 -2
- data/vendor/assets/javascripts/unstable/angular-resource.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-route.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-sanitize.js +25 -23
- data/vendor/assets/javascripts/unstable/angular-scenario.js +980 -759
- data/vendor/assets/javascripts/unstable/angular-touch.js +1 -1
- data/vendor/assets/javascripts/unstable/angular.js +980 -759
- metadata +2 -2
@@ -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();
|