The errata list is a list of errors and their corrections that were found after the product was released.
The following errata were submitted by our customers and have not yet been approved or disproved by the author or editor. They solely represent the opinion of the customer.
Version |
Location |
Description |
Submitted by |
Date submitted |
Printed |
Page x
United States |
"Mathias Matias" should be just "Matias".
|
Mark Volkmann |
Sep 25, 2013 |
Printed |
Page many
United States |
A general comment on writing ... I don't think you're allowed to break words across lines without using a hyphen.
|
Mark Volkmann |
Sep 29, 2013 |
Printed |
Page all
|
Anyone not using google's codeo for the examples in the book MUST realize that an important change in the angularJS library was introduced with angularjs 1.2, so that none of the examples in the first chapter, and quite possibly much of the book will work with a locally hosted current version of the library.
A decent explanation of the change can be found at http://stackoverflow.com/questions/19943935/angularjs-scope-difference-1-0-x-vs-1-2-x
Readers should thus download https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.js
|
Anonymous |
Mar 21, 2015 |
PDF |
Page 6
$scope.remove = function |
The last line of the following function is probably best ended with a semicolon (;)
$scope.remove = function(index) {
$scope.items.splice(index, 1);
}
|
Steve taylor |
Sep 03, 2014 |
Printed |
Page 7
figure 1-4 |
The items in the figure is Pebbles, Paint pots and Prunes in that order but in the code on page 6 and 8 it is Paint pots, Polka dots and Pebbles in that order
This is in the printed version second release 2013-06-04
|
Kjell Isacson |
Aug 13, 2013 |
Printed |
Page 14
first example top of the page |
This is not a technical mistake but there's a difference between examples in page 13 and 14 that could be avoided. The first example use {{messages.someText}} and the second use {{someText.message}}. That could be a little confusing at first.
|
Anonymous |
Mar 27, 2014 |
PDF |
Page 17
3RD PARAGRAPH |
function StartUpController($scope) {
$scope.funding = { startingEstimate: 0 };
computeNeeded = function() {
$scope.funding.needed = $scope.funding.startingEstimate * 10;
};
$scope.$watch('funding.startingEstimate', computeNeeded);
}
THIS SHOULD BE
function StartUpController($scope) {
$scope.funding = { startingEstimate: 0 , needed: 0 };
$scope.computeNeeded = function() {
$scope.funding.needed = $scope.funding.startingEstimate * 10;
};
$scope.$watch('funding.startingEstimate', $scope.computeNeeded);
}
|
Abhishikth |
May 22, 2014 |
PDF |
Page 22
2 |
<button ng-click="insertTom()">Insert</button>
Need to be included in the ' ng-controller='StudentListController''
|
Anonymous |
Nov 28, 2013 |
Printed |
Page 24
United States |
In $scope.stun method, change 'true' to true (remove single quotes).
|
Mark Volkmann |
Sep 23, 2013 |
Printed |
Page 27
United States |
In the first line, the characters "<=" were combined into a single symbol.
|
Mark Volkmann |
Sep 23, 2013 |
Printed |
Page 27
United States |
At the end of the first paragraph, "reference arrays and object notation" should be "reference array elements and object properties".
|
Mark Volkmann |
Sep 23, 2013 |
Printed |
Page 27
United States |
Near the end of the third paragraph, "view and controllers" should be "views and controllers".
|
Mark Volkmann |
Sep 23, 2013 |
Printed |
Page 27
section "Expressions", paragraph 2, line 4 |
In the list of bitwise operations, there is a backslash in front of the carat. The list should read "(^, &, |)", with no backslash after the open paren.
|
Stephen Gildea |
Oct 08, 2013 |
Printed |
Page 27
2nd paragraph |
In the line:
make comparisons (==, !=, >, <, >=, ⇐),
⇐ of course should have been a <= but I suspect some Auto-Replace in software might have messed this up.
|
Anonymous |
Nov 05, 2013 |
Printed |
Page 35
United States |
In the table with columns "Function" and "Defines",
factory(name, $getFunction()) should be
factory(name, function)
and
service(name, constructor() should be
service(name, constructor)
The functions passed to these should not be executed in the calls to factory and service.
|
Mark Volkmann |
Sep 23, 2013 |
PDF |
Page 36
The example code... |
Missing a ng-repeat, add <tr ng-repeat = "item in items"> to the code as following...
<table>
<tr ng-repeat="item in items">
<td>{{item.title}}</td>
<td>{{item.description}}</td>
<td>{{item.price | currency}}</td>
</tr>
</table>
|
Anonymous |
Aug 16, 2013 |
PDF |
Page 39 and 40
index.html and controllers.js code examples |
index.html is
<html ng-app="AMail">
<head>
<script src="src/angular.js"></script>
<script src="src/controllers.js"></script>
</head>
<body>
<h1>A-Mail</h1>
<div ng-view></div>
</body>
</html>
is must be
<html ng-app="AMail">
<head>
<script src="src/angular.js"></script>
<script src="src/angular-route.js"></script>
<script src="src/controllers.js"></script>
</head>
<body>
<h1>A-Mail</h1>
<div ng-view></div>
</body>
</html>
controller.js module creation is
var aMailServices = angular.module('AMail', []);
it must be
var aMailServices = angular.module('AMail', ["ngRoute"]);
this will enable routing for the example
|
Andre Dublin |
Nov 13, 2013 |
PDF |
Page 41
code example |
messages = [{
/* code omitted */
}];
should be
var messages = [{
/* code omitted */
}];
|
Andre Dublin |
Nov 13, 2013 |
PDF |
Page 41
3rd "fake e-mail" on the variable |
On the fake e-mails array below the comment: //fake e-mails
how it is:
{
id: 2, sender: 'bill@somecompany.com', subject: 'Lost python',
date: 'Dec 6, 2013 20:35:02', recipients: ['greg@somecompany.com'],
message: "Nobody panic, but my pet python is missing from her cage.'
+'She doesn't move too fast, so just call me if you see her."
}, ];
how it should be:
{
id: 2, sender: 'bill@somecompany.com', subject: 'Lost python',
date: 'Dec 6, 2013 20:35:02', recipients: ['greg@somecompany.com'],
message: "Nobody panic, but my pet python is missing from her cage."
+"She doesn't move too fast, so just call me if you see her."
}, ];
Just quotes / double quotes inconsistency.
|
Welington Cruz |
Dec 03, 2013 |
Printed |
Page 42
HTML Example at bottom of page. |
There is a missing <div> after the <body> tag (i.e. there is a </div> before the </body> without a matching <div> after <body>).
|
Steven Gray |
Aug 31, 2013 |
PDF |
Page 43
code block at the botoom |
page 43:
appModule.directive('ngbkFocus', function() {
page 44:
<button ngbk-focus ng-click="clickFocused()">
It needs to be ngbkFocus or ngbk-focus.
|
Anonymous |
Nov 02, 2015 |
PDF |
Page 44
controller.js code example |
In the controller.js code example the last line reads
var appModule = angular.module('app', ['directives']);
It should be
var appModule = angular.module('app', []);
You do not need to pass a dependency to use directives for modules
|
Andre Dublin |
Nov 13, 2013 |
PDF |
Page 44
controller.js |
$scope.clickFocused = function {
should be:
$scope.clickFocused = function() {
|
Anonymous |
Oct 17, 2014 |
Printed |
Page 50
United States |
This error was introduced in the third printing.
In the fourth paragraph, ") repository)" should be ") repository".
In extra paren is present.
|
Mark Volkmann' |
Sep 29, 2013 |
Printed |
Page 53
United States |
In the first sentence in the TDD box, "AGILE" should not be all uppercase since it is not an acronym.
|
Mark Volkmann |
Sep 26, 2013 |
Printed |
Page 55
United States |
In the first sentence, change "code that could" to "code could" or "code can".
|
Mark Volkmann |
Sep 26, 2013 |
PDF |
Page 69-76
Integrating AngularJS with RequireJS |
Yeoman related information is outdated.
When you setup a project with yeoman, the vendor libraries are storied in the bower_components folder. It would make sense to use bower for the requirejs libraries as well.
E.g.
> bower install requirejs --save
> bower install requirejs-domready --save
and then appropriately update the paths in main.js, index.html, etc.
|
nonplus |
Jul 13, 2013 |
Printed |
Page 78
United States |
The page number is from the third printing.
In the cookie recipe screenshot I'm pretty sure "chewy on the outside" was meant to be "chewy on the inside". This error appears again in the code on the following page.
|
Mark Volkmann |
Sep 29, 2013 |
Printed |
Page 81
United States |
The page number is for the third printing.
In the "Services" section, in the second to last paragraph on page 81, change "Of the the" to "Of the".
|
Mark Volkmann |
Sep 29, 2013 |
Printed |
Page 88
1st line of code example (the comment) |
In the first line of the code example (a comment), it says that the file is app/scripts/controllers/controllers.js, while it should be app/scripts/app.js
|
Gabriele Nosso |
Nov 12, 2014 |
Printed |
Page 89
United States |
The page number is in the third release.
In the fifth paragraph, "passed into the constructor" should be "passed into the controller function". I don't think it is considered to be a constructor when written in the style using the module controller method. You might also want to add to the end of this sentence "using dependency injection".
|
Mark Volkmann |
Sep 29, 2013 |
Printed |
Page 89
United States |
The page number is in the third release.
The section "The Templates" makes use of Twitter Bootstrap which is a great thing. But it never explicitly states that it is doing that. Readers that are unfamiliar with Twitter Bootstrap will likely be confused by this HTML. For example, they won't know what class="span2" means. I don't think the book needs to explain Twitter Bootstrap, just say that this example uses several CSS classes from Twitter Bootstrap.
|
Mark Volkmann |
Sep 29, 2013 |
Printed |
Page 91
United States |
The page number is for the third release.
In the first line, "works it magic" should be "works its magic".
|
Mark Volkmann |
Sep 29, 2013 |
Printed |
Page 91
United States |
The page number is in the third release.
In list.html, within the li tag there is no need to wrap the a tag with a div tag.
|
Mark Volkmann |
Sep 29, 2013 |
Printed |
Page 92
3rd paragraph |
The text says "The next interesting usage is that of ng-show and ng-class...the <i> tag..."
None of these appear in the preceding code or in the github code.
|
EdHatch |
Sep 27, 2013 |
Printed |
Page 92
4th paragraph |
The text says "The ng-class is used to add a class to the <h2> tag..."
This does not appear in the code above or on github.
|
EdHatch |
Sep 27, 2013 |
PDF |
Page 92
3rd paragraph |
The book says "The next interesting usage is that of the ng-show and ng-class to style the template. The ng-show tag has been added to the <i> tag....
The code provided doesn't show this at all and neither did the included code files, its as if the author came back after the fact and made changes to the template and the code doesn't reflect that.
There really needs to be better proofing, because this entire book is plagued with mistakes and it makes me feel ripped off and un-trusting as to the validity of the actual content.
It seems to be an industry wide problem, because the last 10 book I purchased suffer from the same issues. I don't expect books to be 100% perfect, but come on, this book has errata for nearly every other page!
|
Joe LoMoglio |
Oct 22, 2013 |
Printed |
Page 94
United States |
The page number is in the third release.
In the second paragraph, "ng-controller tag" should be "ng-controller directive".
|
Mark Volkmann |
Sep 29, 2013 |
Printed |
Page 94
United States |
The page number is in the third release.
In the fifth paragraph, change "required tag" to "required directive".
|
Mark Volkmann |
Sep 29, 2013 |
Printed |
Page 95
United States |
The page number is in the third release.
Someone really loves the word "tag"! ;-)
I think most people assume that to mean an HTML tag.
In the first paragraph, change "$invalid tag" to "$invalid property".
|
Mark Volkmann |
Sep 29, 2013 |
Printed |
Page 96
United States |
The page number is in the third release.
The first numbered list item says "Creates a globally accessible scope and controller". That is misleading. I looked at the code for a while to figure out where it did that, but it does not do that. This should say "Declares globally accessible scope and controller variables".
|
Mark Volkmann |
Oct 01, 2013 |
Printed |
Page 96
United States |
The page number is in the third release.
The test suite for ListCtrl declares and sets the variables mockBackend and recipe, but neither is used in the test.
Remove those to avoid confusion.
Likewise, the suite for MultiRecipeLoader on the next page declares and sets recipe, but doesn't use it.
|
Mark Volkmann |
Oct 01, 2013 |
Printed |
Page 98
United States |
The page number is in the third release.
In the beforeEach of the EditController suite, the variable ctrl is never used. Can't that line be changed to just "$controller('EditCtrl', {"?
|
Mark Volkmann |
Oct 01, 2013 |
Printed |
Page 98
United States |
The page number is in the third release.
In the beforeEach of the EditController suite, the variable ctrl is never used. Can't that line be changed to just "$controller('EditCtrl', {"?
|
Mark Volkmann |
Oct 01, 2013 |
Printed |
Page 102
United States |
The page number is in the third release.
In the POST example at the bottom of the page, lines 2-5 are indented too far.
|
Mark Volkmann |
Oct 01, 2013 |
Printed |
Page 104
United States |
The page number is in the third release.
The example value for params shows an array containing an object with two properties, key1 and key2. It should be just the object, not an array containing the object.
|
Mark Volkmann |
Oct 01, 2013 |
Printed |
Page 104
United States |
The page number is in the third release.
In the first numbered bullet under "Setting HTTP Headers", ", /" should be ", */*".
|
Mark Volkmann |
Oct 06, 2013 |
PDF |
Page 108
1 |
The test was writing for NamesListCtrl controller . Not sure how it ends up at PhoneListCtrl . Or was that something different you were trying to point out ?
|
Hari K T |
Feb 19, 2014 |
Printed |
Page 109
United States |
The page number is in the third release.
In the third bullet under "The ngResource", "Use inject $resource" should be "Inject $resource".
|
Mark Volkmann |
Oct 01, 2013 |
Printed |
Page 110
United States |
The page number is in the third release.
The book should explain that CreditCard.delete is just an alias for CreditCard.remove and that remove is easier to use in IE since delete is treated as a keyword in IE.
Also, the book should explain that $save, $remove and $delete are instance methods on resource objects that do not require identifying the object to be acted upon, whereas save, remove and delete are like class methods that require you to pass the resource object to them.
|
Mark Volkmann |
Oct 06, 2013 |
PDF |
Page 110
3rd paragraph |
Not sur if this is an error or typo
myAppModule.factory('CreditCard', ['$resource', function($resource) { return $resource('/user/:userId/card/:cardId',
}]);
{userId: 123, cardId: '@id'}
the @id is explained on page 111 as "tWe say cardId is "@id.?, but nowhere in the example page 110 (6th line before end) is used on 'id' param, there is a CardId but no id
This should be clarified because it is hard to understand
|
Francois Jacquier |
Jun 10, 2014 |
Printed |
Page 112
United States |
The page number is in the third release.
In the first paragraph, "card's" should be "cards" and it should be monospaced.
|
Mark Volkmann |
Oct 06, 2013 |
Printed |
Page 114
United States |
The page number is in the third release.
The first bullet is missing a period the end of its last sentence, after "in the UI".
|
Mark Volkmann |
Oct 06, 2013 |
Printed |
Page 120
United States |
The page number is in the third release.
In the send paragraph, change "namespace-directive" to "namespace-directive-name" to be consist with the first sentence under "Directives and HTML Validation" on the previous page.
|
Mark Volkmann |
Oct 06, 2013 |
PDF |
Page 121
Box titled "When can you use Angular Resources?" |
The 4th point looks like it should probably be PUT to update the user 123's credit card nr 15.
|
Sam Gronblom |
Feb 06, 2014 |
Printed |
Page 125
United States |
The page number is in the third release.
The last paragraph discusses an approach to "concatenate all the templates into a single file", but it doesn't describe how that file is later split back into separate templates. This is not obvious.
|
Mark Volkmann |
Oct 06, 2013 |
Printed |
Page 128
United States |
The page number is in the third release.
In the second paragraph where it says "receives a transclude function as a property", "property" should be "parameter".
|
Mark Volkmann |
Oct 06, 2013 |
Printed |
Page 128
United States |
The page number is in the third release.
In the last sentence of the first paragraph under "Scopes", change "Evaluate" to "Scope is also used to evaluate". The sentence doesn't make sense as is.
|
Mark Volkmann |
Oct 06, 2013 |
Printed |
Page 132
United States |
The page number is in the third release.
In the title of table 6-6, "Angular specific" should be "Angular-specific".
|
Mark Volkmann |
Oct 06, 2013 |
Printed |
Page 144
United States |
The page number is in the third release.
In the first paragraph where is says "after the injector is finished creating.", I was wondering "When it is finished creating what?". Then I realized you meant "after the injector has been created." I think it is more clear to word it that way.
|
Mark Volkmann |
Oct 06, 2013 |
Printed |
Page 147
United States |
The page number is in the third release.
In the first full sentence, "parents" should be "ancestors". The word "parent" implies only one level above.
|
Mark Volkmann |
Oct 06, 2013 |
Printed |
Page 150
United States |
The page number is in the third release.
In the first sentence under "Creating localized rule sets", remove the parentheses. The sentence shouldn't end with just "like".
|
Mark Volkmann |
Oct 06, 2013 |
Printed |
Page 150
United States |
The page number is in the third release.
At the end of the second paragraph, change "contents of the" to "contents of" or add the word "file" to the end of the sentence.
|
Mark Volkmann |
Oct 06, 2013 |
Printed |
Page 152
United States |
The page number is in the third release.
The second sentence on the page says "the style tag ... removed". But style is an attribute, not a tag. Change it to "the p tag".
|
Mark Volkmann |
Oct 06, 2013 |
Printed |
Page 152
United States |
The page number is in the third release.
There are two lines that show this example output:
an html _click here_ snippet
I believe the underscores are a markup attempt to get "click here" to appear in italics.
In the first occurrence, "click here" should not be in italics because the "em" tag will be removed.
In the second occurrence, "click here" should be in italics.
In both cases, the underscores should be removed.
|
Mark Volkmann |
Oct 06, 2013 |
Printed |
Page 152
United States |
The page number is in the third release.
In the first sentence in the "Linky" section, "convert links" should be "convert URLs". I don't think people look at a string like "http://angularjs.org/" and think of it as a link. They only think of it as a link when there is an "a" tag present.
|
Mark Volkmann |
Oct 06, 2013 |
Printed |
Page 154
United States |
The page number is in the third release.
The value given to the require property is '?ngModel', but the command above it says "Always use along with an ng-model".
Shouldn't the "?" be removed since specifying ng-model is not optional?
Wouldn't that remove the need to check for the presence of ngModel in the link function?
|
Mark Volkmann |
Oct 07, 2013 |
Printed |
Page 154
United States |
The page number is in the third release.
Earlier I posted an errata for this that asked whether the require property in the directive definition object should start with "?" indicating that it is optional. I tested this. Since this directive requires ngModel to be specified, I think it is much better to remove the "?". That also allows the check for ngModel in the beginning of the link function to be removed. If ng-model is omitted from the input element in the HTML, the error message "No controller: ngModel" will be output which seems appropriate.
|
Mark Volkmann |
Oct 09, 2013 |
Printed |
Page 157
United States |
The page number is in the third release.
The second paragraph should not be indented.
|
Mark Volkmann |
Oct 07, 2013 |
PDF |
Page 162
In the link function in the fileupload directive code example, following line: "if (scope.done) {" |
Parameters "e" and "data" are ommitted on call to optionsObj.done(). Should be specified like it is on the optionsObj.progress() method.
if (scope.done) {
optionsObj.done = function() {
scope.$apply(function() {
scope.done({e: e, data: data});
});
};
Should be:
if (scope.done) {
optionsObj.done = function(e, data) {
scope.$apply(function() {
scope.done({e: e, data: data});
});
};
directive will crash after succesful upload with "'e' undefined" error unless code updated!
|
Tommy Bowes |
Apr 25, 2014 |
Printed |
Page 162
half way down the page: inside the link: elemnt, the scope.done section is wrong (javascript code) |
File upload example does not work properly - in particular, does not
call the "done" function properly. Reason:
parameter e and data are missing from anonymous function definition. section should read:
if( scope.done ) {
optionsObj.done = function( e, data ) { // THESE PARAMETERS WERE MISSING
...
}
Took me about 4 hours javascript debugging to notice this, because I'm not very familiar
with Firefox Web Developer tools..
Note that this error is still present in the github repo - I downloaded the example from:
https://github.com/shyamseshadri/angularjs-book/blame/master/chapter8/file-upload/directives.js
|
Duncan White |
Apr 27, 2015 |
Printed |
Page 163
United States |
The page number is in the third release.
I think it is much more common to specify the "lang" attribute on the "html" element than on the "head" attribute. After all, the "body" is also in the same language.
|
Mark Volkmann |
Oct 10, 2013 |
Printed |
Page 164
United States |
The page number is in the third release.
In the last sentence describing the "done" attribute, "arguments that our directive calls" should be "arguments that our directive passes" since arguments cannot be called.
|
Mark Volkmann |
Oct 10, 2013 |
Printed |
Page 165
United States |
The page number is in the third release.
In the second to last paragraph, "on event and broadcast event" should be "on event and emit event". The Socket.IO methods being called are "on" and "emit".
|
Mark Volkmann |
Oct 10, 2013 |
Printed |
Page 168
United States |
The page number is in the third release.
In the second to last paragraph, "The fetch function", strange as it sounds, should be "The fetchFunction function" since that is the actual name of the function.
|
Mark Volkmann |
Oct 10, 2013 |
Printed |
Page 169
United States |
The page number is in the third release.
I realize you would have more tests that this for real code, but I suggest modifying the test you show so that the number of elements in the "items" array (6) is not a multiple of the page size (3). Removing the 6 from the array and the expected results would make this seem like a more likely scenario.
|
Mark Volkmann |
Oct 10, 2013 |
Printed |
Page 171
United States |
The page number is in the third release.
At the bottom of the page a service is defined named "errorService". However, in the references to it that follow the name is "ErrorService".
|
Mark Volkmann |
Oct 13, 2013 |
Printed |
Page 172
United States |
The page number is in the third release.
The "clear" method defined in ErrorService at the top of the page is never called.
|
Mark Volkmann |
Oct 13, 2013 |
Printed |
Page 172
United States |
The page number is in the third release.
Why is the error message stored in both the ErrorMessage service and in the scope of the alertBar directive? Couldn't the ErrorMessage service be injected into the directive so it could get errorMessage from there instead of storing it again in its own scope?
|
Mark Volkmann |
Oct 13, 2013 |
Printed |
Page 173
United States |
The page number is in the third release.
In the second paragraph to the end, I think it would be more clear to change "Since this will change every time" to "Since this will be different for each user". The former gives the impression that it changes with each request.
|
Mark Volkmann |
Oct 13, 2013 |