SlideShare ist ein Scribd-Unternehmen logo
1 von 34
Downloaden Sie, um offline zu lesen
Dev-day
                Ember.js
A JavaScript framework for creating ambitious web
                   applications


                 Juliana Lucena
                  26 Oct 2012
Why?




    • Clearly separate back-end and front-
      end
    • Faster user    app interaction
    • Makes your life easier :)



2
Ember.js




    • Browser based MVC framework
    • Eliminates boilerplate
    • Provides architecture
    • Based on event propagation



3
Dependencies




    • jQuery
    • Handlebars.js - Template language

      <script type="text/x-handlebars" data-template-name="answer">
        <a href="#" class="author-name">{{ answer.author.name }}</a>
        <span class="status-info">respondeu:</span>
        {{#if answer.created_at}}
          {{datetime answer.created_at}}
        {{/if}}
        <p class="input-user">{{ answer.content.text }}</p>
      </script>


4
Examples




    • http://emberjs.com/examples/
    • https://github.com/dgeb/
      ember_data_example




5
Ember.js MVC


6
MVC Workflow

                                         User
                       Noties
    Model                               action
                                                          View


       Updates
                           Controller                   Updates



                 • Tracks the app’s state
    Router       • Affects the application’s view hierarchy
                 • Mediates between the MVC components
                            Serialize
                 URL                    Usable app state
                          Deserialize


7
Hello Redu

var App = Em.Application.create();

App.ApplicationView = Em.View.extend({
  templateName: 'application'
});

App.ApplicationController = Em.View.extend({!
});

App.Router = Em.Router.extend({                        index.html
  root: Ember.Route.extend({
                                           (...)
     index: Ember.Route.extend({
                                           <body>
        route: '/'                           <script type="text/x-handlebars"
     })                                    data-template-name="application">
  })                                           <h1>Hello Redu! (chuckle)</h1>
});                                          </script>
                                           </body>
                                           (...)
App.initialize();

                                                   http://jsddle.net/x8zpH/1/


8
M for Model
        Ember.Object




9
Ember.Object



     • Enhanced JavaScript object model
     • Computed Properties (synthetizes
       properties)
     • Observers (reacts to changes)
     • Bindings (syncs objects)
                                  Always access properties
                                     using get and set

10
Ember.Object

var App = Ember.Application.create();

App.Person = Em.Object.extend({
  firstName: null,
  lastName: null,

  fullName: function(){
      return this.get('firstName') + " " + this.get('lastName');
  }.property('firstName', 'lastName')
});                                     Computed Property

var john = App.Person.create({
  firstName: "John",
  lastName: "Doe"
});
john.get("fullName"); // John Doe
                                           What about computed property for arrays, hĂŁn?

                                    femalesCount: function() {
http://jsddle.net/cBWsr/2/             var people = this.get('people');
                                        return people.filterProperty('isFemale', true).
                                          get('length');
                                    }.property('people.@each.isFemale')


11
Ember.Object

var App = Ember.Application.create();

App.Person = Em.Object.extend({
  login: null,
  firstName: null,

  changedFirstName: function(){
    this.set('login', this.get('firstName').toLowerCase());
  }.observes('firstName')
});                          Observer

var john = App.Person.create();
john.set('firstName', 'John');
john.get("login"); // john




                                                 http://jsddle.net/X7QBU/3/


12
Ember.Object


App = Ember.Application.create({});

App.wife = Ember.Object.create({
  householdIncome: 80000
});

App.husband = Ember.Object.create({
  householdIncomeBinding: 'App.wife.householdIncome'
                                                                Binding
});

Ember.run.later(function() {
  // someone gets a raise
  App.husband.set('householdIncome', 90000);
}, 3000);​
                                                  See the magic inside the view
                                      <script type="text/x-handlebars" >
                                         Wifes income: {{App.wife.householdIncome}}<br/>
                                         Husbands income: {{App.husband.householdIncome}}
http://jsfiddle.net/qQ382/              </script>​




13
Ember.Object




     • Apply for Models
     • Apply for Controllers
     • Apply for Views
     • Apply for (...)



14
Time for Dojo


15
Time for Dojo




     • Already?
     • It will be in a paused way
     • We have so many concepts to discuss




16
Time for Dojo


     todo   doing   verify   done




17
Time for Dojo


     • Scrum board
      • Stories and tasks (executed by a person)
        •   I want to create stories (tasks)

        •   I want to edit stories (tasks)

        •   I want to delete stories (tasks)

        •   I want to assign a task for me

      • No server integration (for now)
                                                       Next dev-day /o/
                                                        (ember-data)
18
Time for Dojo




     • Spoiler: http://jsfiddle.net/37YMc/2/




19
Router


20
Router




     • Maps URLs to states and vice versa
     • Preferred for building large apps
     • Can link views based on the state
     • Loves name conventions



21
Router

App.Router = Ember.Router.extend({
  root: Em.Route.extend({
    contacts: Em.Route.extend({
      route: '/',
      redirectsTo: 'index'

            index: Em.Route.extend({
              route: '/',

        connectOutlets: function(router) {
          router.get('applicationController').connectOutlet('contacts',
App.Contacts.findAll());
        }
      }),

            contact: Em.Route.extend({
              route: '/contacts/:contact_id',

                 connectOutlets: function(router, context) {
                    router.get('contactsController').connectOutlet('contact', context);
                 },
            })
       })
  })
});




22
WTF is outlet?


     ApplicationView                    Name convention


        {{outlet}}
                                   router.get('applicationController').
                                   connectOutlet('contacts', objects);


                 Name convention


                                            Passed objects


      ContactsView
        (objects)

23
C for Controller


24
C for Controller




     • Controller    simple controller

     • ObjectController       support to manipulate
       an Object

     • ArrayController     support to manipulate a
       collection




25
C for Controller

                       Accessing the content
App.ContactController = Em.ObjectController.extend({
  someProperty: 'cool-value',

  destroyRecord: function() {
    this.get('content').destroy();
  }
});




            pushing a object to a controller’s collection

App.ContactsController = Em.ArrayController.extend({
  createContact: function(name) {

         push
     var contact = App.Contact.create({ name: name });
     this.pushObject(contact);
  },
});
                                                                   Remember that all
                                                                binding’s magic apply to
                                                                      Controllers
26
V for View


27
V for View



     • Always associated with a template
     • Your friend when dealing with browser
       events
      • touch (touchStart), keyboard (keyDown),
        mouse (mouseDown), form (submit), drag
        and drop (dragStart),



28
V for View

App.EditContactView = Ember.View.extend({
  templateName: 'edit_contact',
  tagName: 'form',
  classNames: ['form-horizontal'],

     didInsertElement: function() {
                                           DOM event
        this._super();
        this.$('input:first').focus();
     },

  submit: function(event) {
                                       Browser event
    event.preventDefault();
    this.get('controller').updateRecord();
  }
});

                 <script type="text/x-handlebars" data-template-name="edit_contact">
                    {{ view Ember.TextArea }}
                    <button class="button-primary" type="submit">Enviar</button>
                 </script>




29
Handlebars
        helpers

30
Handlebars helpers




     • {{#if}}
     • {{#each}}
     • {{view}}
     • {{action}}



31
Final doubts


32
References




     • http://emberjs.com/ (updated
       yesterday!)
     • http://emberwatch.com/




33
Thanks. /o/

        Juliana Lucena


34

Weitere ähnliche Inhalte

Was ist angesagt?

Backbone.js and friends
Backbone.js and friendsBackbone.js and friends
Backbone.js and friends
Good Robot
 
«От экспериментов с инфраструктурой до внедрения в продакшен»​
«От экспериментов с инфраструктурой до внедрения в продакшен»​«От экспериментов с инфраструктурой до внедрения в продакшен»​
«От экспериментов с инфраструктурой до внедрения в продакшен»​
FDConf
 
Redux. From twitter hype to production
Redux. From twitter hype to productionRedux. From twitter hype to production
Redux. From twitter hype to production
FDConf
 

Was ist angesagt? (20)

Javascript Module Patterns
Javascript Module PatternsJavascript Module Patterns
Javascript Module Patterns
 
Viking academy backbone.js
Viking academy  backbone.jsViking academy  backbone.js
Viking academy backbone.js
 
Angular 1 + es6
Angular 1 + es6Angular 1 + es6
Angular 1 + es6
 
Workshop 1: Good practices in JavaScript
Workshop 1: Good practices in JavaScriptWorkshop 1: Good practices in JavaScript
Workshop 1: Good practices in JavaScript
 
AngularJS Architecture
AngularJS ArchitectureAngularJS Architecture
AngularJS Architecture
 
Workshop 3: JavaScript build tools
Workshop 3: JavaScript build toolsWorkshop 3: JavaScript build tools
Workshop 3: JavaScript build tools
 
Backbone.js and friends
Backbone.js and friendsBackbone.js and friends
Backbone.js and friends
 
Intro to Ember.js
Intro to Ember.jsIntro to Ember.js
Intro to Ember.js
 
«От экспериментов с инфраструктурой до внедрения в продакшен»​
«От экспериментов с инфраструктурой до внедрения в продакшен»​«От экспериментов с инфраструктурой до внедрения в продакшен»​
«От экспериментов с инфраструктурой до внедрения в продакшен»​
 
AngularJS for Java Developers
AngularJS for Java DevelopersAngularJS for Java Developers
AngularJS for Java Developers
 
Laravel 8 export data as excel file with example
Laravel 8 export data as excel file with exampleLaravel 8 export data as excel file with example
Laravel 8 export data as excel file with example
 
Workshop 27: Isomorphic web apps with ReactJS
Workshop 27: Isomorphic web apps with ReactJSWorkshop 27: Isomorphic web apps with ReactJS
Workshop 27: Isomorphic web apps with ReactJS
 
Building a Startup Stack with AngularJS
Building a Startup Stack with AngularJSBuilding a Startup Stack with AngularJS
Building a Startup Stack with AngularJS
 
Vue.js + Django - configuraciĂłn para desarrollo con webpack y HMR
Vue.js + Django - configuraciĂłn para desarrollo con webpack y HMRVue.js + Django - configuraciĂłn para desarrollo con webpack y HMR
Vue.js + Django - configuraciĂłn para desarrollo con webpack y HMR
 
Workshop 4: NodeJS. Express Framework & MongoDB.
Workshop 4: NodeJS. Express Framework & MongoDB.Workshop 4: NodeJS. Express Framework & MongoDB.
Workshop 4: NodeJS. Express Framework & MongoDB.
 
Redux. From twitter hype to production
Redux. From twitter hype to productionRedux. From twitter hype to production
Redux. From twitter hype to production
 
AngularJS Basics with Example
AngularJS Basics with ExampleAngularJS Basics with Example
AngularJS Basics with Example
 
Drupal 8: Fields reborn
Drupal 8: Fields rebornDrupal 8: Fields reborn
Drupal 8: Fields reborn
 
Introduction to Node.JS Express
Introduction to Node.JS ExpressIntroduction to Node.JS Express
Introduction to Node.JS Express
 
Backbone.js
Backbone.jsBackbone.js
Backbone.js
 

Ähnlich wie Ember.js - A JavaScript framework for creating ambitious web applications

Introducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and serverIntroducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and server
Spike Brehm
 
Practical AngularJS
Practical AngularJSPractical AngularJS
Practical AngularJS
Wei Ru
 
How and why i roll my own node.js framework
How and why i roll my own node.js frameworkHow and why i roll my own node.js framework
How and why i roll my own node.js framework
Ben Lin
 

Ähnlich wie Ember.js - A JavaScript framework for creating ambitious web applications (20)

Ember.js for Big Profit
Ember.js for Big ProfitEmber.js for Big Profit
Ember.js for Big Profit
 
Angular js
Angular jsAngular js
Angular js
 
Building Web Apps with Express
Building Web Apps with ExpressBuilding Web Apps with Express
Building Web Apps with Express
 
Introducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and serverIntroducing Rendr: Run your Backbone.js apps on the client and server
Introducing Rendr: Run your Backbone.js apps on the client and server
 
Introduction to Ember.js
Introduction to Ember.jsIntroduction to Ember.js
Introduction to Ember.js
 
Practical AngularJS
Practical AngularJSPractical AngularJS
Practical AngularJS
 
Writing HTML5 Web Apps using Backbone.js and GAE
Writing HTML5 Web Apps using Backbone.js and GAEWriting HTML5 Web Apps using Backbone.js and GAE
Writing HTML5 Web Apps using Backbone.js and GAE
 
Basics of AngularJS
Basics of AngularJSBasics of AngularJS
Basics of AngularJS
 
Meteor Meet-up San Diego December 2014
Meteor Meet-up San Diego December 2014Meteor Meet-up San Diego December 2014
Meteor Meet-up San Diego December 2014
 
Patterns Are Good For Managers
Patterns Are Good For ManagersPatterns Are Good For Managers
Patterns Are Good For Managers
 
React & The Art of Managing Complexity
React &  The Art of Managing ComplexityReact &  The Art of Managing Complexity
React & The Art of Managing Complexity
 
Crossing the Bridge: Connecting Rails and your Front-end Framework
Crossing the Bridge: Connecting Rails and your Front-end FrameworkCrossing the Bridge: Connecting Rails and your Front-end Framework
Crossing the Bridge: Connecting Rails and your Front-end Framework
 
Containers & Dependency in Ember.js
Containers & Dependency in Ember.jsContainers & Dependency in Ember.js
Containers & Dependency in Ember.js
 
Clojure and the Web
Clojure and the WebClojure and the Web
Clojure and the Web
 
Good karma: UX Patterns and Unit Testing in Angular with Karma
Good karma: UX Patterns and Unit Testing in Angular with KarmaGood karma: UX Patterns and Unit Testing in Angular with Karma
Good karma: UX Patterns and Unit Testing in Angular with Karma
 
AngularJs Crash Course
AngularJs Crash CourseAngularJs Crash Course
AngularJs Crash Course
 
How and why i roll my own node.js framework
How and why i roll my own node.js frameworkHow and why i roll my own node.js framework
How and why i roll my own node.js framework
 
Angular.js Primer in Aalto University
Angular.js Primer in Aalto UniversityAngular.js Primer in Aalto University
Angular.js Primer in Aalto University
 
MVC on the server and on the client
MVC on the server and on the clientMVC on the server and on the client
MVC on the server and on the client
 
Top 10 Mistakes AngularJS Developers Make
Top 10 Mistakes AngularJS Developers MakeTop 10 Mistakes AngularJS Developers Make
Top 10 Mistakes AngularJS Developers Make
 

KĂźrzlich hochgeladen

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 

KĂźrzlich hochgeladen (20)

GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024Manulife - Insurer Innovation Award 2024
Manulife - Insurer Innovation Award 2024
 
Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024Top 10 Most Downloaded Games on Play Store in 2024
Top 10 Most Downloaded Games on Play Store in 2024
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 

Ember.js - A JavaScript framework for creating ambitious web applications

  • 1. Dev-day Ember.js A JavaScript framework for creating ambitious web applications Juliana Lucena 26 Oct 2012
  • 2. Why? • Clearly separate back-end and front- end • Faster user app interaction • Makes your life easier :) 2
  • 3. Ember.js • Browser based MVC framework • Eliminates boilerplate • Provides architecture • Based on event propagation 3
  • 4. Dependencies • jQuery • Handlebars.js - Template language <script type="text/x-handlebars" data-template-name="answer"> <a href="#" class="author-name">{{ answer.author.name }}</a> <span class="status-info">respondeu:</span> {{#if answer.created_at}} {{datetime answer.created_at}} {{/if}} <p class="input-user">{{ answer.content.text }}</p> </script> 4
  • 5. Examples • http://emberjs.com/examples/ • https://github.com/dgeb/ ember_data_example 5
  • 7. MVC Workflow User Noties Model action View Updates Controller Updates • Tracks the app’s state Router • Affects the application’s view hierarchy • Mediates between the MVC components Serialize URL Usable app state Deserialize 7
  • 8. Hello Redu var App = Em.Application.create(); App.ApplicationView = Em.View.extend({ templateName: 'application' }); App.ApplicationController = Em.View.extend({! }); App.Router = Em.Router.extend({ index.html root: Ember.Route.extend({ (...) index: Ember.Route.extend({ <body> route: '/' <script type="text/x-handlebars" }) data-template-name="application"> }) <h1>Hello Redu! (chuckle)</h1> }); </script> </body> (...) App.initialize(); http://jsddle.net/x8zpH/1/ 8
  • 9. M for Model Ember.Object 9
  • 10. Ember.Object • Enhanced JavaScript object model • Computed Properties (synthetizes properties) • Observers (reacts to changes) • Bindings (syncs objects) Always access properties using get and set 10
  • 11. Ember.Object var App = Ember.Application.create(); App.Person = Em.Object.extend({ firstName: null, lastName: null, fullName: function(){ return this.get('firstName') + " " + this.get('lastName'); }.property('firstName', 'lastName') }); Computed Property var john = App.Person.create({ firstName: "John", lastName: "Doe" }); john.get("fullName"); // John Doe What about computed property for arrays, hĂŁn? femalesCount: function() { http://jsddle.net/cBWsr/2/ var people = this.get('people'); return people.filterProperty('isFemale', true). get('length'); }.property('people.@each.isFemale') 11
  • 12. Ember.Object var App = Ember.Application.create(); App.Person = Em.Object.extend({ login: null, firstName: null, changedFirstName: function(){ this.set('login', this.get('firstName').toLowerCase()); }.observes('firstName') }); Observer var john = App.Person.create(); john.set('firstName', 'John'); john.get("login"); // john http://jsddle.net/X7QBU/3/ 12
  • 13. Ember.Object App = Ember.Application.create({}); App.wife = Ember.Object.create({ householdIncome: 80000 }); App.husband = Ember.Object.create({ householdIncomeBinding: 'App.wife.householdIncome' Binding }); Ember.run.later(function() { // someone gets a raise App.husband.set('householdIncome', 90000); }, 3000);​ See the magic inside the view <script type="text/x-handlebars" > Wifes income: {{App.wife.householdIncome}}<br/> Husbands income: {{App.husband.householdIncome}} http://jsddle.net/qQ382/ </script>​ 13
  • 14. Ember.Object • Apply for Models • Apply for Controllers • Apply for Views • Apply for (...) 14
  • 16. Time for Dojo • Already? • It will be in a paused way • We have so many concepts to discuss 16
  • 17. Time for Dojo todo doing verify done 17
  • 18. Time for Dojo • Scrum board • Stories and tasks (executed by a person) • I want to create stories (tasks) • I want to edit stories (tasks) • I want to delete stories (tasks) • I want to assign a task for me • No server integration (for now) Next dev-day /o/ (ember-data) 18
  • 19. Time for Dojo • Spoiler: http://jsddle.net/37YMc/2/ 19
  • 21. Router • Maps URLs to states and vice versa • Preferred for building large apps • Can link views based on the state • Loves name conventions 21
  • 22. Router App.Router = Ember.Router.extend({ root: Em.Route.extend({ contacts: Em.Route.extend({ route: '/', redirectsTo: 'index' index: Em.Route.extend({ route: '/', connectOutlets: function(router) { router.get('applicationController').connectOutlet('contacts', App.Contacts.findAll()); } }), contact: Em.Route.extend({ route: '/contacts/:contact_id', connectOutlets: function(router, context) { router.get('contactsController').connectOutlet('contact', context); }, }) }) }) }); 22
  • 23. WTF is outlet? ApplicationView Name convention {{outlet}} router.get('applicationController'). connectOutlet('contacts', objects); Name convention Passed objects ContactsView (objects) 23
  • 25. C for Controller • Controller simple controller • ObjectController support to manipulate an Object • ArrayController support to manipulate a collection 25
  • 26. C for Controller Accessing the content App.ContactController = Em.ObjectController.extend({ someProperty: 'cool-value', destroyRecord: function() { this.get('content').destroy(); } }); pushing a object to a controller’s collection App.ContactsController = Em.ArrayController.extend({ createContact: function(name) { push var contact = App.Contact.create({ name: name }); this.pushObject(contact); }, }); Remember that all binding’s magic apply to Controllers 26
  • 28. V for View • Always associated with a template • Your friend when dealing with browser events • touch (touchStart), keyboard (keyDown), mouse (mouseDown), form (submit), drag and drop (dragStart), 28
  • 29. V for View App.EditContactView = Ember.View.extend({ templateName: 'edit_contact', tagName: 'form', classNames: ['form-horizontal'], didInsertElement: function() { DOM event this._super(); this.$('input:first').focus(); }, submit: function(event) { Browser event event.preventDefault(); this.get('controller').updateRecord(); } }); <script type="text/x-handlebars" data-template-name="edit_contact"> {{ view Ember.TextArea }} <button class="button-primary" type="submit">Enviar</button> </script> 29
  • 30. Handlebars helpers 30
  • 31. Handlebars helpers • {{#if}} • {{#each}} • {{view}} • {{action}} 31
  • 33. References • http://emberjs.com/ (updated yesterday!) • http://emberwatch.com/ 33
  • 34. Thanks. /o/ Juliana Lucena 34