|
| 1 | +<a name="1.3.0-RC.0"></a> |
| 2 | +# 1.3.0-RC.0 sonic-boltification (2014-08-29) |
| 3 | + |
| 4 | + |
| 5 | +## Bug Fixes |
| 6 | + |
| 7 | +- **$animate:** |
| 8 | + - wait two until two digests are over until enabling animations |
| 9 | + ([92576743](https://github.com/angular/angular.js/commit/92576743eec0cef5ffdd701b83f72a61e6489c3b), |
| 10 | + [#8844](https://github.com/angular/angular.js/issues/8844)) |
| 11 | + - ensure guarded animations consider AJAX requests upon bootstrap |
| 12 | + ([4bca4c44](https://github.com/angular/angular.js/commit/4bca4c44b95a7435722605a750804043f2960160), |
| 13 | + [#8275](https://github.com/angular/angular.js/issues/8275), [#5262](https://github.com/angular/angular.js/issues/5262)) |
| 14 | + - use $timeout to handle the delay within staggering animations |
| 15 | + ([23da6140](https://github.com/angular/angular.js/commit/23da614043fe5dcf0be132b86466eecb11c766a2), |
| 16 | + [#7228](https://github.com/angular/angular.js/issues/7228), [#7547](https://github.com/angular/angular.js/issues/7547), [#8297](https://github.com/angular/angular.js/issues/8297), [#8547](https://github.com/angular/angular.js/issues/8547)) |
| 17 | +- **$browser:** detect changes to the browser url that happened in sync |
| 18 | + ([3be00df4](https://github.com/angular/angular.js/commit/3be00df495f6eed3b3d9587ebab1fdd633e94e08), |
| 19 | + [#6976](https://github.com/angular/angular.js/issues/6976)) |
| 20 | +- **$compile:** use the correct namespace for transcluded svg elements |
| 21 | + ([cb73a37c](https://github.com/angular/angular.js/commit/cb73a37c7cae5cdebadf7b3ddd44c5a452495e4e), |
| 22 | + [#8808](https://github.com/angular/angular.js/issues/8808), [#8816](https://github.com/angular/angular.js/issues/8816)) |
| 23 | +- **$location:** always resolve relative links in html5mode to `<base>` url |
| 24 | + ([22948807](https://github.com/angular/angular.js/commit/22948807e324eb0b182b15b31045dc306a9f3231), |
| 25 | + [#8492](https://github.com/angular/angular.js/issues/8492), [#8172](https://github.com/angular/angular.js/issues/8172)) |
| 26 | +- **$parse:** properly handle dots at the end of identifiers |
| 27 | + ([8ac90357](https://github.com/angular/angular.js/commit/8ac90357a66ae0c62dbfe6db2c6eaf1d600ecc65), |
| 28 | + [#4613](https://github.com/angular/angular.js/issues/4613), [#4912](https://github.com/angular/angular.js/issues/4912), [#8559](https://github.com/angular/angular.js/issues/8559)) |
| 29 | +- **Angular:** remove duplicate nodeName_ references |
| 30 | + ([a4520a74](https://github.com/angular/angular.js/commit/a4520a745d917c77f1d12cdbce48272c643f7255)) |
| 31 | +- **currencyFilter:** pass through null and undefined values |
| 32 | + ([c2aaddbe](https://github.com/angular/angular.js/commit/c2aaddbe4b21348aab8c13a78cdd6aaee846ae4e), |
| 33 | + [#8605](https://github.com/angular/angular.js/issues/8605)) |
| 34 | +- **docs:** don't throw exception on the 404 page |
| 35 | + ([550ba01b](https://github.com/angular/angular.js/commit/550ba01b325fc29460030fc9c24fa00269dec2a9), |
| 36 | + [#8518](https://github.com/angular/angular.js/issues/8518)) |
| 37 | +- **input:** |
| 38 | + - validate minlength/maxlength for non-string values |
| 39 | + ([77ce5b89](https://github.com/angular/angular.js/commit/77ce5b89f97aa83c3eb1fe2e19375ef00a822015), |
| 40 | + [#7967](https://github.com/angular/angular.js/issues/7967), [#8811](https://github.com/angular/angular.js/issues/8811)) |
| 41 | + - allow to use seconds in `input[time]` and `input[datetime-local]` |
| 42 | + ([5f90340a](https://github.com/angular/angular.js/commit/5f90340abb78aa08dde4876328bcc00e46232e46)) |
| 43 | + - use year 1970 instead of 1900 for `input[time]` |
| 44 | + ([29f0b568](https://github.com/angular/angular.js/commit/29f0b568debab7810752969d363d337099e96cdc)) |
| 45 | +- **ngBindHtml:** throw error if interpolation is used in expression |
| 46 | + ([cd21602d](https://github.com/angular/angular.js/commit/cd21602d5b1650d8be373618cb7320d697e32c4d), |
| 47 | + [#8824](https://github.com/angular/angular.js/issues/8824)) |
| 48 | +- **ngEventDirs:** execute `blur` and `focus` expression using `scope.$evalAsync` |
| 49 | + ([719c747c](https://github.com/angular/angular.js/commit/719c747cd892ee933e7e414a7dc97e657b88317d), |
| 50 | + [#4979](https://github.com/angular/angular.js/issues/4979), [#5945](https://github.com/angular/angular.js/issues/5945), [#8803](https://github.com/angular/angular.js/issues/8803), [#6910](https://github.com/angular/angular.js/issues/6910), [#5402](https://github.com/angular/angular.js/issues/5402)) |
| 51 | +- **ngModel:** |
| 52 | + - always format the viewValue as a string for text, url and email types |
| 53 | + ([1eda1836](https://github.com/angular/angular.js/commit/1eda18365a348c9597aafba9d195d345e4f13d1e)) |
| 54 | + - allow non-assignable binding when getterSetter is used |
| 55 | + ([ab878a6c](https://github.com/angular/angular.js/commit/ab878a6c038f47b95f3a7e85a4fdb599e0c73e63), |
| 56 | + [#8704](https://github.com/angular/angular.js/issues/8704)) |
| 57 | + - treat undefined parse responses as parse errors |
| 58 | + ([db044c40](https://github.com/angular/angular.js/commit/db044c408a7f8082758b96ab739348810c36e15a)) |
| 59 | +- **ngRepeat:** improve errors for duplicate items |
| 60 | + ([0604bb7b](https://github.com/angular/angular.js/commit/0604bb7b7a6156e33679396e805e327662d9a178)) |
| 61 | +- **ngSwitch:** avoid removing DOM nodes twice within watch operation |
| 62 | + ([c9b0bfec](https://github.com/angular/angular.js/commit/c9b0bfecc99837af1c97792b3ca3408ba182b0bb), |
| 63 | + [#8662](https://github.com/angular/angular.js/issues/8662)) |
| 64 | +- **numberFilter:** pass through null and undefined values |
| 65 | + ([2ae10f67](https://github.com/angular/angular.js/commit/2ae10f67fcde3e172f695956301ef796b68a50c2), |
| 66 | + [#8605](https://github.com/angular/angular.js/issues/8605), [#8842](https://github.com/angular/angular.js/issues/8842)) |
| 67 | + |
| 68 | + |
| 69 | +## Features |
| 70 | + |
| 71 | +- **core:** |
| 72 | + - add angular.reloadWithDebugInfo() |
| 73 | + ([41c1b88](https://github.com/angular/angular.js/commit/41c1b8858f02c7310bfabdd545ebb28e90eb4258)) |
| 74 | +- **$animate:** |
| 75 | + - use promises instead of callbacks for animations |
| 76 | + ([bf0f5502](https://github.com/angular/angular.js/commit/bf0f5502b1bbfddc5cdd2f138efd9188b8c652a9)) |
| 77 | + - coalesce concurrent class-based animations within a digest loop |
| 78 | + ([2f4437b3](https://github.com/angular/angular.js/commit/2f4437b3a149eafb899f25933bd6c713b167d10e)) |
| 79 | +- **$compile:** |
| 80 | + - bind isolate scope properties to controller |
| 81 | + ([5f3f25a1](https://github.com/angular/angular.js/commit/5f3f25a1a6f9d4f2a66e2700df3b9c5606f1c255), |
| 82 | + [#7635](https://github.com/angular/angular.js/issues/7635), [#7645](https://github.com/angular/angular.js/issues/7645)) |
| 83 | + - allow disabling scope info |
| 84 | + ([a1e5cd5f](https://github.com/angular/angular.js/commit/a1e5cd5fe3906ebee8c400247a1f793d3e2239fb)) |
| 85 | +- **$compile/ngBind:** allow disabling binding info |
| 86 | + ([3660fd09](https://github.com/angular/angular.js/commit/3660fd0912d3ccf6def8c9f02d8d4c0621c8d91f)) |
| 87 | +- **$http:** implement mechanism for coalescing calls to $apply in $http |
| 88 | + ([ea6fc6e6](https://github.com/angular/angular.js/commit/ea6fc6e69c2a2aa213c71ed4e917a0d54d064e4c), |
| 89 | + [#8736](https://github.com/angular/angular.js/issues/8736), [#7634](https://github.com/angular/angular.js/issues/7634), [#5297](https://github.com/angular/angular.js/issues/5297)) |
| 90 | +- **$rootScope:** implement $applyAsync to support combining calls to $apply into a single digest. |
| 91 | + ([e94d454b](https://github.com/angular/angular.js/commit/e94d454b840f6cc55a440741382b407836ad245b)) |
| 92 | +- **$templateRequest:** introduce the $templateRequest service |
| 93 | + ([a70e2833](https://github.com/angular/angular.js/commit/a70e2833ea276107b11aafea96ef4a6724ad4d83)) |
| 94 | +- **filter:** allow to define the timezone for formatting dates |
| 95 | + ([4739b1d9](https://github.com/angular/angular.js/commit/4739b1d9daebfd094b6181c5f2cb52ff71e31c61)) |
| 96 | +- **filterFilter:** pass index to function predicate |
| 97 | + ([46343c60](https://github.com/angular/angular.js/commit/46343c603db6192daf5303b92eb664749326c7e6), |
| 98 | + [#654](https://github.com/angular/angular.js/issues/654)) |
| 99 | +- **input:** allow to define the timezone for parsing dates |
| 100 | + ([cc6fc199](https://github.com/angular/angular.js/commit/cc6fc199f5abaacdf781aa03634337d776eb0fc9), |
| 101 | + [#8447](https://github.com/angular/angular.js/issues/8447)) |
| 102 | +- **minErr:** allow specifying ErrorConstructor in minErr constructor |
| 103 | + ([a6bd4bc8](https://github.com/angular/angular.js/commit/a6bd4bc866a18f860c7548fa1b3f6d4c2a953416)) |
| 104 | +- **ngModel:** provide validation API functions for sync and async validations |
| 105 | + ([2ae4f40b](https://github.com/angular/angular.js/commit/2ae4f40be1803d999ca2a8cc30ec17ff19ea6d86)) |
| 106 | +- **ngRoute:** alias string as redirectTo property in .otherwise() |
| 107 | + ([3b5d75c0](https://github.com/angular/angular.js/commit/3b5d75c021e21fa6ec4dc6c47b8eafa55680ea63), |
| 108 | + [#7794](https://github.com/angular/angular.js/issues/7794)) |
| 109 | +- **testability:** add $$testability service |
| 110 | + ([85880a64](https://github.com/angular/angular.js/commit/85880a64900fa22a61feb926bf52de0965332ca5)) |
| 111 | + |
| 112 | + |
| 113 | +## Performance Improvements |
| 114 | + |
| 115 | +- **$compile:** |
| 116 | + - add debug classes in compile phase |
| 117 | + ([e0489abd](https://github.com/angular/angular.js/commit/e0489abd8d9e4971ae23cc38805a92d227d1f3a1)) |
| 118 | + - only iterate over elements with link functions |
| 119 | + ([fdf9989f](https://github.com/angular/angular.js/commit/fdf9989f7cf1ed81982a788b75a338ac33334571), |
| 120 | + [#8741](https://github.com/angular/angular.js/issues/8741)) |
| 121 | +- **nodeName_:** simplify the code and reduce the number of DOM calls |
| 122 | + ([5a1a0c96](https://github.com/angular/angular.js/commit/5a1a0c96220101b5e040f0755e5eb401e2c73f65)) |
| 123 | +- **select:** execute render after $digest cycle |
| 124 | + ([6f7018d5](https://github.com/angular/angular.js/commit/6f7018d52fa4f9f9c7fa8e3035317d1239efb20f), |
| 125 | + [#8825](https://github.com/angular/angular.js/issues/8825)) |
| 126 | + |
| 127 | + |
| 128 | +## Breaking Changes |
| 129 | + |
| 130 | +- **$location**: due to [22948807](https://github.com/angular/angular.js/commit/22948807e324eb0b182b15b31045dc306a9f3231) |
| 131 | + |
| 132 | +#### since 1.2.0 and 1.3.0-beta.1 |
| 133 | + |
| 134 | +Angular now requires a `<base>` tag when html5 mode of `$location` is enabled. Reasoning: |
| 135 | +Using html5 mode without a `<base href="...">` tag makes relative links for images, links, ... |
| 136 | +relative to the current url if the browser supports |
| 137 | +the history API. However, if the browser does not support the history API Angular falls back to using the `#`, |
| 138 | +and then all those relative links would be broken. |
| 139 | + |
| 140 | +The `<base>` tag is also needed when a deep url is loaded from the server, e.g. `http://server/some/page/url`. |
| 141 | +In that case, Angular needs to decide which part of the url is the base of the application, and which part |
| 142 | +is path inside of the application. |
| 143 | + |
| 144 | +To summarize: Now all relative links are always relative to the `<base>` tag. |
| 145 | + |
| 146 | +Exception (also a breaking change): |
| 147 | +Link tags whose `href` attribute starts with a `#` will only change the hash of the url, but nothing else |
| 148 | +(e.g. `<a href="#someAnchor">`). This is to make it easy to scroll to anchors inside a document. |
| 149 | + |
| 150 | +Related to #6162 |
| 151 | +Closes #8492 |
| 152 | + |
| 153 | +#### since 1.2.17 and 1.3.0-beta.10 |
| 154 | + |
| 155 | +In html5 mode without a `<base>` tag on older browser that don't support the history API |
| 156 | +relative paths were adding up. E.g. clicking on `<a href="page1">` and then on `<a href="page2">` |
| 157 | +would produce `$location.path()==='/page1/page2'. The code that introduced this behavior was removed |
| 158 | +and Angular now also requires a `<base>` tag to be present when using html5 mode. |
| 159 | + |
| 160 | +Closes #8172, #8233 |
| 161 | + |
| 162 | + |
| 163 | +- **ngInclude, ngMessage, ngView and directives that load templates**: due to [a70e2833](https://github.com/angular/angular.js/commit/a70e2833ea276107b11aafea96ef4a6724ad4d83) |
| 164 | + |
| 165 | +Angular will now throw a $compile minErr each a template fails to download |
| 166 | +for ngView, directives and ngMessage template requests. This changes the former |
| 167 | +behavior of silently ignoring failed HTTP requests--or when the template itself |
| 168 | +is empty. Please ensure that all directive, ngView and ngMessage code now properly |
| 169 | +addresses this scenario. NgInclude is uneffected from this change. |
| 170 | + |
| 171 | + |
| 172 | +- **$animate**: due to [23da6140](https://github.com/angular/angular.js/commit/23da614043fe5dcf0be132b86466eecb11c766a2) |
| 173 | + |
| 174 | +If any stagger code consisted of having BOTH transition staggers and delay staggers |
| 175 | +together then that will not work the same way. Angular will now instead choose |
| 176 | +the highest stagger delay value and set the timeout to wait for that before |
| 177 | +applying the active CSS class. |
| 178 | + |
| 179 | + |
| 180 | +- **$animate**: due to [bf0f5502](https://github.com/angular/angular.js/commit/bf0f5502b1bbfddc5cdd2f138efd9188b8c652a9) |
| 181 | + |
| 182 | +Both the API for the cancallation method and the done callback for |
| 183 | +$animate animations is different. Instead of using a callback function |
| 184 | +for each of the $animate animation methods, a promise is used instead. |
| 185 | + |
| 186 | +```js |
| 187 | +//before |
| 188 | +$animate.enter(element, container, null, callbackFn); |
| 189 | + |
| 190 | +//after |
| 191 | +$animate.enter(element, container).then(callbackFn); |
| 192 | +``` |
| 193 | + |
| 194 | +The animation can now be cancelled via `$animate.cancel(promise)`. |
| 195 | + |
| 196 | +```js |
| 197 | +//before |
| 198 | +var cancelFn = $animate.enter(element, container); |
| 199 | +cancelFn(); //cancels the animation |
| 200 | + |
| 201 | +//after |
| 202 | +var promise = $animate.enter(element, container); |
| 203 | +$animate.cancel(promise); //cancels the animation |
| 204 | +``` |
| 205 | + |
| 206 | +keep in mind that you will still need to run $scope.$apply inside of the `then` callback |
| 207 | +to trigger a digest. |
| 208 | + |
| 209 | + |
| 210 | +- **$animate**: due to [2f4437b3](https://github.com/angular/angular.js/commit/2f4437b3a149eafb899f25933bd6c713b167d10e) |
| 211 | + |
| 212 | +$animate.addClass, $animate.removeClass and $animate.setClass will no longer start the animation |
| 213 | +right after being called in the directive code. The animation will only commence once a digest |
| 214 | +has passed. This means that all animation-related testing code requires an extra digest to kick |
| 215 | +off the animation. |
| 216 | + |
| 217 | +```js |
| 218 | +//before this fix |
| 219 | +$animate.addClass(element, 'super'); |
| 220 | +expect(element).toHaveClass('super'); |
| 221 | + |
| 222 | +//now |
| 223 | +$animate.addClass(element, 'super'); |
| 224 | +$rootScope.$digest(); |
| 225 | +expect(element).toHaveClass('super'); |
| 226 | +``` |
| 227 | + |
| 228 | +$animate will also tally the amount of times classes are added and removed and only animate |
| 229 | +the left over classes once the digest kicks in. This means that for any directive code that |
| 230 | +adds and removes the same CSS class on the same element then this may result in no animation |
| 231 | +being triggered at all. |
| 232 | + |
| 233 | +```js |
| 234 | +$animate.addClass(element, 'klass'); |
| 235 | +$animate.removeClass(element, 'klass'); |
| 236 | + |
| 237 | +$rootScope.$digest(); |
| 238 | + |
| 239 | +//nothing happens... |
| 240 | +``` |
| 241 | + |
| 242 | + |
| 243 | +- **$compile/ngBind:** due to [3660fd09](https://github.com/angular/angular.js/commit/3660fd0912d3ccf6def8c9f02d8d4c0621c8d91f), |
| 244 | + |
| 245 | +The value of `$binding` data property on an element is always an array now |
| 246 | +and the expressions do not include the curly braces `{{ ... }}`. |
| 247 | + |
| 248 | + |
| 249 | +- **currencyFilter:** due to [c2aaddbe](https://github.com/angular/angular.js/commit/c2aaddbe4b21348aab8c13a78cdd6aaee846ae4e), |
| 250 | + previously the currency filter would convert null and undefined values into empty string, after this change |
| 251 | +these values will be passed through. |
| 252 | + |
| 253 | +Only cases when the currency filter is chained with another filter that doesn't expect null/undefined will be affected. This |
| 254 | +should be very rare. |
| 255 | + |
| 256 | +This change will not change the visual output of the filter because the interpolation will convert the null/undefined to |
| 257 | +an empty string. |
| 258 | + |
| 259 | +Closes #8605 |
| 260 | + |
| 261 | + |
| 262 | +- **numberFilter:** due to [2ae10f67](https://github.com/angular/angular.js/commit/2ae10f67fcde3e172f695956301ef796b68a50c2), |
| 263 | + previously the number filter would convert null and undefined values into empty string, after this change |
| 264 | +these values will be passed through. |
| 265 | + |
| 266 | +Only cases when the number filter is chained with another filter that doesn't expect null/undefined will be affected. This |
| 267 | +should be very rare. |
| 268 | + |
| 269 | +This change will not change the visual output of the filter because the interpolation will convert the null/undefined to |
| 270 | +an empty string. |
| 271 | + |
| 272 | +Closes #8605 |
| 273 | +Closes #8842 |
| 274 | + |
| 275 | + |
| 276 | +- **input:** |
| 277 | + - due to [77ce5b89](https://github.com/angular/angular.js/commit/77ce5b89f97aa83c3eb1fe2e19375ef00a822015), |
| 278 | + |
| 279 | +NgModel.viewValue will always be used when rendering validations for `minlength` and `maxlength`. |
| 280 | + |
| 281 | +Closes #7967 |
| 282 | +Closes #8811 |
| 283 | + |
| 284 | +- **input:** |
| 285 | + - due to [29f0b568](https://github.com/angular/angular.js/commit/29f0b568debab7810752969d363d337099e96cdc), |
| 286 | + |
| 287 | + |
| 288 | +According to the HTML5 spec `input[time]` should create dates |
| 289 | +based on the year 1970 (used to be based on the year 1900). |
| 290 | + |
| 291 | +Related to #8447. |
| 292 | + |
| 293 | + |
| 294 | +- **ngModel**: due to [db044c40](https://github.com/angular/angular.js/commit/db044c408a7f8082758b96ab739348810c36e15a) |
| 295 | + |
| 296 | +Any parser code from before that returned an `undefined` value |
| 297 | +(or nothing at all) will now cause a parser failure. When this occurs |
| 298 | +none of the validators present in `$validators` will run until the parser |
| 299 | +error is gone. The error will be stored on `ngModel.$error`. |
| 300 | + |
| 301 | + |
| 302 | + |
| 303 | + |
| 304 | +- **ngEventDirs:** due to [719c747c](https://github.com/angular/angular.js/commit/719c747cd892ee933e7e414a7dc97e657b88317d), |
| 305 | + |
| 306 | +The `blur` and `focus` event fire synchronously, also during DOM operations |
| 307 | +that remove elements. This lead to errors as the Angular model was not |
| 308 | +in a consistent state. See this [fiddle](http://jsfiddle.net/fq1dq5yb/) for a demo. |
| 309 | + |
| 310 | +This change executes the expression of those events using |
| 311 | +`scope.$evalAsync` if an `$apply` is in progress, otherwise |
| 312 | +keeps the old behavior. |
| 313 | + |
| 314 | +Fixes #4979 |
| 315 | +Fixes #5945 |
| 316 | +Closes #8803 |
| 317 | +Closes #6910 |
| 318 | +Closes #5402 |
| 319 | + |
| 320 | + |
| 321 | + |
1 | 322 | <a name="1.2.23"></a>
|
2 | 323 | # 1.2.23 superficial-malady (2014-08-22)
|
3 | 324 |
|
|
0 commit comments