Intro to Angularjs, Javascript Done Right

Intro to Angularjs, Javascript Done Right

<angular/> JavaScript Done Right Elliott Sprehn (Google, Inc.) [email protected] http://www.elliottsprehn.com/blog/ http://www.elliottsprehn.com/cfbugs/ http://www.angularjs.org/ 1 ColdFusion rocks • Easily create HTML templates • Power for heavy lifting when you need it • Solves the hard problems for me • Dependency injection frameworks • ColdSpring, Lightwire, DI/1 • MVC frameworks • ColdBox, ModelGlue, Mach-ii, FW/1, ... 2 Flex is sweet • Flexible compiler • Custom metadata • Two way data binding • Reusable components • Dependecy injection frameworks • Swiz, SmartyPants, Spring Action Script • MVC frameworks • PureMVC, Mate, Parsley, ... 3 Development in JavaScript is getting better... • Mature JS libraries • jQuery • Mootools • ... • Powerful UI frameworks • jQuery UI • ExtJS • YUI • ... 4 ... but, it could be awesome. <angular/> 5 Declarative markup • ng:include • Include HTML partials like cfinclude. • ng:repeat • Loop over collections like cfloop. • ng:show / ng:hide • Show or hide nodes based on a condition. • ng:class • Add or remove classes from nodes. • ng:click / ng:change • Handle user interactions with the page. 6 Expression evaluation and filters • Expressions {{user.name}} • Filters {{user.dateRegistered | date: 'MM/yyyy'}} • Extensible (CFML on the client?) #user.name# 7 Two way data binding • Form controls <input name="echo"> {{echo}} • Automatic evaluation <button ng:click="value = value + 1"> {{value}} 8 Model-View-Controller <form ng:controller="ProfileController" ng:submit="save()"> <h2>Hello, {{user.name}}.</h2> <p>You can edit your profile details below.</p> <label>Email <input name="user.email"></label> <label>Address <textarea name="user.address"></textarea></label> <input type="submit" value="Save"> </form> <script> function ProfileController() { this.user = {name: 'Elliott', email: '[email protected]'}; this.save = function() { // Ajax request to save the user }; }; </script> 9 Dependency Injection • Automatic injection function ProfileController($resource, activityService_) { ... }; • Explicit injection function ProfileController(resource, activityService) { ... }; ProfileController.$inject = ['$resource', 'activityService']; 10 RESTful resources • Like ORM for REST • Supports caching, bulking and JSONP • Mocks provided for testing <script> // $resource is automatically injected by name. function ProfileController($resource) { var Users = $resource('/users/me'); this.user = Users.get(); this.save = function() { Users.save(this.user); }; }; </script> 11 Service abstraction • Define services for use in your controllers • Easily swapped out for testing angular.service('profileService', function($resource) { return $resource('profiles/:id'); }); function ProfileController(profileService_) { // ... }); 12 Create your own custom tags widgets • Define your own widgets <app:ProfileEditor profile="user"> </app:ProfileEditor> • Reusable Components <jqui:Button icon="ui-icon-gear">Click Me</jqui:Button> • Attributes <input name="tags" jqui:autocomplete="tagList"> 13 No more global state • Controllers • Services • Scopes <form ng:controller="ProfileController" ...> <h2>Hello, {{user.name}}.</h2> ... <div ng:repeat="comment in user.recentComments"> <h4> {{comment.parentPost.title}} [<span ng:click="hideComment(comment)">Remove</span>] </h4> <p>{{comment.text}}</p> </div> </form> 14 Testability • No DOM manipulation in controllers • Mocks provided for XHR • Easily mock out services • Angular services are not special • JsTD and Jasmine integration 15 End-to-End Runner <script> describe('ProfileController', function() { it('should save profiles', function() { browser().navigateTo('/profiles/mine'); expect(element('h2').text()).toEqual('Hello, Elliott.'); input('firstname').enter('Ethan'); element('#save').click(); browser().reload(); expect(element('h2').text()).toEqual('Hello, Ethan.'); }); }); </script> 16 End-to-End DSL <script> describe('ProfileController', function() { it('should save profiles', function() { browser().navigateTo('/profiles/mine'); expect(profilePage().greeting()). toEqual('Hello, Elliott.'); profilePage().firstName().enter('Ethan'); profilePage().save(); browser().reload(); expect(profilePage().greeting()). toEqual('Hello, Ethan.'); }); }); </script> 17 Questions ? 18.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    18 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us