|
|
10 years ago | |
|---|---|---|
| .. | ||
| advanced_angular_potpourri.md | 10 years ago | |
| readme.md | 10 years ago | |
readme.md
ADVANCED ANGULAR POTPOURRI
exercises on various Angular techniques
Starter Code
You will receive a simple backend with an index route that serves Ryan Gosling and Hypatia of Alexandria (from our Wednesday dating app). Seed your database by going to /users/seed, and verifying the JSON in the index route, /users.
NOTE This app doesn't do much, but serves as a platform for you to practise various Angular helpers and techniques: ######various
$http$scope- events
$emit,$broadcast,$on
ng-include(templating)- custom directives (templating)
##1. $scope.$broadcast, $scope.$on
index.html
You have two controllers separate from each other, RyanController and HypatiaController. Each of them contains the same child controller InfoController. The child controller will display the information associated with both Ryan and Hypatia.
The format looks like this:
* Ryan
* -child
* -display data
* -end child
* end Ryan
* Hypatia
* -child
* - display data
* -end child
* end Hypatia
Make it so that when you click the getInfo() button in either controller, the data is retrieved from the database and then shown on the page from within the child. The data must be broadcast to the child, and on receipt the child should displays that data.
NOTE, Ryan should be results.data[0] and Hypatia should be results.data[1], but double check.
##2. $scope.$emit, $scope.$on
Next, put a button inside the child that runs a function in the child controller. The function should emit a message back up to the parent, and on receipt display inside the parent (not in the child).
##3. ng-include
Use ng-include to load a template that displays the data inside the child, so that you don't have to write all the curlies each time within each child.
Hint on broadcasting multiple values: You can broadcast an array of separate values.
##4. Custom Directives and $scope.$parent
This is really difficult, so please have a nutritious smoothie before you begin. Deep breaths.
-
Make a custom directive that renders a form. In
index.html, put the directive inside each of the child controllers. Inapp.jsyour directive should haverestrict:,templateUrl:,controller:, andcontrollerAs:. -
The form should be a template in a
form.htmlfile that the directive'stemplateUrl:uses. -
The form should
editthe information from theInfoController, so it should be pre-populated with the user's name, gender, etc, from theInfoController. -
Upon submit, the form should send a
PUTrequest to the server. You will need to make aPUTroute in the server code (usersController). -
In the controller of the custom directive, you will need to be able to access the ng-model from its parent. For this, you can use
$scope.$parent.whateverthemodelis
This process is really difficult, just making an attempt at it is great
NOTES ON CUSTOM DIRECTIVE SYNTAX
You don't have to put the controller constructor inside the directive like this:
app.directive('myDirective', function() {
controller: the entire controller written
out here inside the directive
lots of code
doing things
end of controller constructor
});
You can decouple the directive and its controller like this:
app.controller('formController', [function() {
the controller written
here like we do with other controllers
doing things
]);
app.directive('myDirective', function() {
controller: 'formController'
});
More information on custom directives: http://weblogs.asp.net/dwahlin/creating-custom-angularjs-directives-part-i-the-fundamentals
BIG BONUSES
-
ADVANCED CUSTOM DIRECTIVES:
Have a look at this tutorial for making a directive for creating draggable DOM elements to get an idea of fancy stuff that directives can do: https://blog.parkji.co.uk/2013/08/11/native-drag-and-drop-in-angularjs.html
-
PASSPORT
If you get this far, you should look into using authentication in a single-page app. You will need to serve up an .ejs file as your landing page / single-page.
