Latest in branch 1.2
1.2.32
Released 11 Oct 2016
(9 years ago)
SoftwareAngularJS
Version1.2
Status
End of life
Initial release1.2.0
08 Nov 2013
(12 years ago)
Latest release1.2.32
11 Oct 2016
(9 years ago)
End of life31 Dec 2021
(Ended 4 years, 5 months ago)
Release noteshttps://github.com/angular/angular.js/blob/master/CHANGELOG.md
Source codehttps://github.com/angular/angular.js/tree/v1.2.32
Documentationhttps://code.angularjs.org/1.2.32/docs/api
Migration guidehttps://code.angularjs.org/1.2.32/docs/guide/migration
Downloadhttps://code.angularjs.org/1.2.32
AngularJS 1.2 ReleasesView full list

What Is New in AngularJS 1.2?

AngularJS 1.2 introduces significant new capabilities, performance refinements, and foundational changes for future development. This release focuses on enhancing the animation system, expression evaluation, and overall stability.

Category Key Highlights
New Features Animation hooks, one-time binding ({{::expr}}), ngAnimate module, ngIf directive.
Improvements & Changes Faster expression parsing, strict DI mode, $parse service improvements, ngRoute separated into its own module.
Breaking Changes Changes to ngRepeat behavior for duplicate keys, input[number] validation, removal of ng:style in favor of ngStyle.
Deprecations ng:style, ng:attr selectors; certain $compile and $animate behaviors.

How does animation support improve in 1.2?

The ngAnimate module is now a core, optional module providing CSS and JavaScript animation hooks. This is a major architectural addition.

Directives like ngRepeat, ngShow, ngHide, and the new ngIf trigger animation events during DOM changes. In practice, you define CSS transitions or keyframe animations against classes like .ng-enter and .ng-leave.

This matters because it decouples animation logic from core Angular, making animations declarative and performant without cluttering your controllers.

What's the deal with one-time binding?

One-time binding ({{::expression}}) is a performance optimization that stops watching an expression after its value stabilizes.

The digest cycle skips these expressions, reducing watcher count. This is crucial for large lists rendered with ngRepeat. The binding becomes inert after the first non-undefined value is assigned, which is ideal for static data.

Use it when you know a value won't change. It's a simple syntax change with immediate performance wins in most real-world apps.

Why is ngRoute now a separate module?

The ngRoute module was extracted from the core angular.js file to reduce the default bundle size. You must now include angular-route.js and explicitly depend on the ngRoute module.

This change anticipates a more modular framework future. It allows teams that use third-party routers (like UI Router) to avoid loading unused code. The migration is straightforward but a common breaking change for upgrades.

What breaking changes affect ngRepeat the most?

ngRepeat now throws an error if it encounters duplicate keys across collection items. Previous versions would silently skip duplicate items.

This enforcement ensures track-by identity is correct, preventing subtle rendering bugs. You must ensure your track by expression or the default $id is unique. In practice, this catches many data preparation bugs early.

FAQ

Is one-time binding a silver bullet for performance?
No, but it's a highly effective tool. It reduces the number of active watchers, which directly speeds up digest cycles. Use it for values that are static after initial rendering, like constants or resolved data from a first API call.

Do I have to use ngAnimate now?
No, the ngAnimate module is completely optional. You only need to include angular-animate.js and add ngAnimate as a module dependency if you want to use the animation hooks. The core framework behavior remains unchanged without it.

My app broke on upgrade due to "duplicate key" errors. What's the fix?
Review the data collection you pass to ngRepeat. Ensure each item has a unique identifier. Use a specific track by expression, like track by item.id, to provide stable and unique keys, or deduplicate your source data.

What is "strict DI mode" and how do I enable it?
Strict DI mode, enabled via ng-strict-di on the app's root element or when manually bootstrapping, throws errors if dependency injection cannot be minification-safe. It forces you to use the array notation or $inject annotation everywhere, which is a good practice for production.

Why did my number input validation stop working?
AngularJS 1.2 changed input[number] to validate against the browser's native number input validation. This is more strict and aligns with HTML5. Non-numeric values now make the form control invalid. You may need to adjust your input type or use a custom validation directive for different numeric formats.

Releases In Branch 1.2

VersionRelease date
1.2.3211 Oct 2016
(9 years ago)
1.2.3111 Oct 2016
(9 years ago)
1.2.3020 Jul 2016
(9 years ago)
1.2.2929 Sep 2015
(10 years ago)
1.2.2813 Dec 2014
(11 years ago)
1.2.2720 Nov 2014
(11 years ago)
1.2.2602 Oct 2014
(11 years ago)
1.2.2516 Sep 2014
(11 years ago)
1.2.2409 Sep 2014
(11 years ago)
1.2.2322 Aug 2014
(11 years ago)
1.2.2211 Aug 2014
(11 years ago)
1.2.2125 Jul 2014
(11 years ago)
1.2.2011 Jul 2014
(11 years ago)
1.2.1930 Jun 2014
(11 years ago)
1.2.1813 Jun 2014
(11 years ago)
1.2.1706 Jun 2014
(12 years ago)
1.2.1603 Apr 2014
(12 years ago)
1.2.1521 Mar 2014
(12 years ago)
1.2.1401 Mar 2014
(12 years ago)
1.2.1314 Feb 2014
(12 years ago)
1.2.1207 Feb 2014
(12 years ago)
1.2.1103 Feb 2014
(12 years ago)
1.2.1024 Jan 2014
(12 years ago)
1.2.915 Jan 2014
(12 years ago)
1.2.810 Jan 2014
(12 years ago)
1.2.703 Jan 2014
(12 years ago)
1.2.619 Dec 2013
(12 years ago)
1.2.513 Dec 2013
(12 years ago)
1.2.406 Dec 2013
(12 years ago)
1.2.327 Nov 2013
(12 years ago)
1.2.222 Nov 2013
(12 years ago)
1.2.114 Nov 2013
(12 years ago)
1.2.008 Nov 2013
(12 years ago)
1.2.0-rc.314 Oct 2013
(12 years ago)
1.2.0-rc.204 Sep 2013
(12 years ago)
1.2.0-rc.113 Aug 2013
(12 years ago)