SlideShare une entreprise Scribd logo
1  sur  25
YUI! E l'App Framewok:
l'MVC secondo Yahoo!
Lucio Grenzi

l.grenzi@gmail.com
Who am I?
• Delphi developer for 11 years
• Now freelance and Asp.net developer
• Javascript addicted
    Nonantolando.blogspot.com
   https://plus.google.com/108943068354277861330
   http://it.linkedin.com/pub/lucio-grenzi/27/2bb/2a

                                                      Lucio Grenzi   2
                                    l.grenzi@gmail.com – Freelance
Who am I?
• Delphi developer for 11 years
• Now freelance and Asp.net developer
• Javascript addicted
    Nonantolando.blogspot.com
   https://plus.google.com/108943068354277861330
   http://it.linkedin.com/pub/lucio-grenzi/27/2bb/2a

                                                      Lucio Grenzi   3
                                    l.grenzi@gmail.com – Freelance
Agenda
•   Brief introduction Yui
•   What's new on Yui 3.4.x
•   How App framework works
•   What's expected on Yui 3.5



                                                   Lucio Grenzi   4
                                 l.grenzi@gmail.com – Freelance
YUI is a free, open source JavaScript and CSS
    framework for building richly interactive web
                    applications.
• Fast
• Complete
• Industrial Strength
• Free & Open
                                                  Lucio Grenzi   5
                                l.grenzi@gmail.com – Freelance
One more javascript framework?
•   jQuery
•   ExtJS
•   Dojo
•   Yui
•   …..


                                               Lucio Grenzi   6
                             l.grenzi@gmail.com – Freelance
What's new on Yui 3.4
• The new Calendar component is now included in the build. This is a very
  early release consisting of Calendar’s core functionality. Skinning and
  additional features will continue to be added ahead of the 3.4.0 launch.
• The App Framework, YUI’s new suite of MVC infrastructure components, is
  fully functional and ready for use.
• ScrollView now supports vertical paging, includes a scrollview-list plugin to
  add CSS classnames to immediate list elements, as well several bug fixes
  and refactoring
• You will also find updates to the Graphics API, performance enhancements
  in Base, bug fixes in Dial, and many more additions throughout the library.


                                                                      Lucio Grenzi   7
                                                    l.grenzi@gmail.com – Freelance
Yui App framework = jQuery + Backbone.js ?
• The YUI 3 app framework is heavily inspired by
  Backbone.js.
• App framework is tightly integrated on the
  framework and takes advantage of YUI's
  fantastic custom event system and extensible
  component infrastructure


                                                 Lucio Grenzi   8
                               l.grenzi@gmail.com – Freelance
Yui App framework blocks
•   Model
•   Model list
•   View
•   Controller



                                                Lucio Grenzi   9
                              l.grenzi@gmail.com – Freelance
Model
is a lightweight Attribute-based data model with
  methods for getting, setting, validating, and
  syncing attribute values to a persistence layer
  or server, as well as events for notifying
  listeners of model changes.



                                                   Lucio Grenzi   10
                                 l.grenzi@gmail.com – Freelance
Model list
is an array-like ordered list of Model instances
  with methods for adding, removing, sorting,
  filtering, and performing other actions on
  models in the list.
All events fired by a model automatically bubble
  up to all the lists that contain that model, so
  lists serve as convenient aggregators for model
  events.
                                                  Lucio Grenzi   11
                                l.grenzi@gmail.com – Freelance
View
represents a renderable piece of an application's
  user interface, and provides hooks for easily
  subscribing to and handling delegated DOM
  events on a view's container element.




                                                  Lucio Grenzi   12
                                l.grenzi@gmail.com – Freelance
Controller
provides URL-based same-page routing using
  HTML5 history (pushState) or the location
  hash, depending on what the user's browser
  supports.




                                                 Lucio Grenzi   13
                               l.grenzi@gmail.com – Freelance
Todo Model
TodoModel = Y.TodoModel = Y.Base.create('todoModel', Y.Model, [], {
  sync: LocalStorageSync('todo'),

    toggleDone: function () {
       this.set('done', !this.get('done')).save();
    }
}, {
    ATTRS: {
       done: {value: false},
       text: {value: ''}
    }
});
                                                                          Lucio Grenzi   14
                                                        l.grenzi@gmail.com – Freelance
ToDo List
TodoList = Y.TodoList = Y.Base.create('todoList', Y.ModelList, [], {
  model: TodoModel,
  sync : LocalStorageSync('todo'),

  done: function () {
     return Y.Array.filter(this.toArray(), function (model) {
         return model.get('done');
     });
  },

  remaining: function () {
     return Y.Array.filter(this.toArray(), function (model) {
         return !model.get('done');
     });
  }});

                                                                                         Lucio Grenzi   15
                                                                       l.grenzi@gmail.com – Freelance
TodoAppView (1/2)
TodoAppView = Y.TodoAppView = Y.Base.create('todoAppView', Y.View, [], {
  container: Y.one('#todo-app'),
  inputNode: Y.one('#new-todo'),
  template: Y.one('#todo-stats-template').getContent(),


  events: {
      '#new-todo': {keypress: 'createTodo'},
      '.todo-clear': {click: 'clearDone'},
      '.todo-item': {
          mouseover: 'hoverOn',
          mouseout : 'hoverOff'
      }
  }
                                                                                         Lucio Grenzi   16
                                                                       l.grenzi@gmail.com – Freelance
TodoAppView (2/2)
initializer: function () {
   var list = this.todoList = new TodoList();
   list.after('add', this.add, this);
   list.after('reset', this.reset, this);
   list.after(['add', 'reset', 'remove', 'todoModel:doneChange'], this.render, this); list.load(); },


render: function () {
   var todoList = this.todoList,
      stats    = this.container.one('#todo-stats'),
      numRemaining, numDone;


   if (todoList.isEmpty()) { stats.empty(); return this; }
   numDone         = todoList.done().length;
   numRemaining = todoList.remaining().length;
                                                                                                       Lucio Grenzi   17
                                                                                     l.grenzi@gmail.com – Freelance
TodoView (1/2)
TodoView = Y.TodoView = Y.Base.create('todoView', Y.View, [], {
  container: '<li class="todo-item"/>',
  template: Y.one('#todo-item-template').getContent(),
  events: {
      '.todo-checkbox': {click: 'toggleDone'},
      '.todo-content': {
           click: 'edit',
           focus: 'edit'
      },
      '.todo-input' : {
           blur    : 'save',
           keypress: 'enter'
      },
      '.todo-remove': {click: 'remove'}
  }
                                                                                    Lucio Grenzi   18
                                                                  l.grenzi@gmail.com – Freelance
TodoView (2/2)
edit: function () {
   this.container.addClass('editing');
   this.inputNode.focus();    },
enter: function (e) {
   if (e.keyCode === 13) { // enter key
       Y.one('#new-todo').focus();
   }   },
remove: function (e) {
   e.preventDefault();
   this.constructor.superclass.remove.call(this);
   this.model.destroy({'delete': true});   },
save: function () {
   this.container.removeClass('editing');
   this.model.set('text', this.inputNode.get('value')).save();   },
toggleDone: function () {    this.model.toggleDone();      }
                                                                                        Lucio Grenzi   19
                                                                      l.grenzi@gmail.com – Freelance
LocalStorageSync (1/2)
function LocalStorageSync(key) {
  var localStorage;
  if (!key) { Y.error('No storage key specified.'); }
  if (Y.config.win.localStorage) { localStorage = Y.config.win.localStorage;}
  var data = Y.JSON.parse((localStorage && localStorage.getItem(key)) || '{}');
  function destroy(id) {
      var modelHash;
      if ((modelHash = data[id])) {
          delete data[id];
          save();
      }
      return modelHash;
  }
                                                                                                  Lucio Grenzi   20
                                                                                l.grenzi@gmail.com – Freelance
LocalStorageSync (2/2)
return function (action, options, callback) {
   var isModel = Y.Model && this instanceof Y.Model;


   switch (action) {
   case 'create': // intentional fallthru
   case 'update': callback(null, set(this));
      return;


   case 'read': callback(null, get(isModel && this.get('id')));
      return;


   case 'delete': callback(null, destroy(isModel && this.get('id')));
      return;
   } };
                                                                                          Lucio Grenzi   21
                                                                        l.grenzi@gmail.com – Freelance
What's next? (3.5.0)
•   Y.Controller is now Y.Router
•   New route handler signature
•   Some properties are now attributes
•   Documentation updated



                                                   Lucio Grenzi   22
                                 l.grenzi@gmail.com – Freelance
References
•   http://yuilibrary.com/projects/yui3/
•   https://github.com/yui/yui3
•   http://yuilibrary.com/yui/docs/app/app-todo.html
•   http://www.yuiblog.com/blog/2011/12/12/app-framework-350/




                                                            Lucio Grenzi   23
                                          l.grenzi@gmail.com – Freelance
Questions?




                               Lucio Grenzi   24
             l.grenzi@gmail.com – Freelance
Thank you




Creative Commons via tcmaker.org



                                                     Lucio Grenzi   25
                                   l.grenzi@gmail.com – Freelance

Contenu connexe

Similaire à Yui app-framework

WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
Fabio Franzini
 
Quick Intro to Android Development
Quick Intro to Android DevelopmentQuick Intro to Android Development
Quick Intro to Android Development
Jussi Pohjolainen
 
RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...
RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...
RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...
jpalley
 

Similaire à Yui app-framework (20)

From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)
 
Starting with jQuery
Starting with jQueryStarting with jQuery
Starting with jQuery
 
Reactive Programming with JavaScript
Reactive Programming with JavaScriptReactive Programming with JavaScript
Reactive Programming with JavaScript
 
WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...WebNet Conference 2012 - Designing complex applications using html5 and knock...
WebNet Conference 2012 - Designing complex applications using html5 and knock...
 
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
 
Jquery library
Jquery libraryJquery library
Jquery library
 
Django introduction
Django introductionDjango introduction
Django introduction
 
Jquery
JqueryJquery
Jquery
 
A Rich Web experience with jQuery, Ajax and .NET
A Rich Web experience with jQuery, Ajax and .NETA Rich Web experience with jQuery, Ajax and .NET
A Rich Web experience with jQuery, Ajax and .NET
 
jQuery in the [Aol.] Enterprise
jQuery in the [Aol.] EnterprisejQuery in the [Aol.] Enterprise
jQuery in the [Aol.] Enterprise
 
The fundamental problems of GUI applications and why people choose React
The fundamental problems of GUI applications and why people choose ReactThe fundamental problems of GUI applications and why people choose React
The fundamental problems of GUI applications and why people choose React
 
Introduction to Django
Introduction to DjangoIntroduction to Django
Introduction to Django
 
J query training
J query trainingJ query training
J query training
 
Quick Intro to Android Development
Quick Intro to Android DevelopmentQuick Intro to Android Development
Quick Intro to Android Development
 
A to Z about JQuery - Become Newbie to Expert Java Developer
A to Z about JQuery - Become Newbie to Expert Java DeveloperA to Z about JQuery - Become Newbie to Expert Java Developer
A to Z about JQuery - Become Newbie to Expert Java Developer
 
How to develop a Graphical User Interface (GUI) in Scilab
How to develop a Graphical User Interface (GUI) in ScilabHow to develop a Graphical User Interface (GUI) in Scilab
How to develop a Graphical User Interface (GUI) in Scilab
 
Lhy tutorial gui(1)
Lhy tutorial gui(1)Lhy tutorial gui(1)
Lhy tutorial gui(1)
 
Introduction to jQuery
Introduction to jQueryIntroduction to jQuery
Introduction to jQuery
 
RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...
RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...
RailsConf 2010: From 1 to 30 - How to refactor one monolithic application int...
 
A Rich Web Experience with jQuery, Ajax and .NET
A Rich Web Experience with jQuery, Ajax and .NETA Rich Web Experience with jQuery, Ajax and .NET
A Rich Web Experience with jQuery, Ajax and .NET
 

Plus de Lucio Grenzi

Jenkins djangovillage
Jenkins djangovillageJenkins djangovillage
Jenkins djangovillage
Lucio Grenzi
 

Plus de Lucio Grenzi (12)

How to use Postgresql in order to handle Prometheus metrics storage
How to use Postgresql in order to handle Prometheus metrics storageHow to use Postgresql in order to handle Prometheus metrics storage
How to use Postgresql in order to handle Prometheus metrics storage
 
Building serverless application on the Apache Openwhisk platform
Building serverless application on the Apache Openwhisk platformBuilding serverless application on the Apache Openwhisk platform
Building serverless application on the Apache Openwhisk platform
 
Patroni: PostgreSQL HA in the cloud
Patroni: PostgreSQL HA in the cloudPatroni: PostgreSQL HA in the cloud
Patroni: PostgreSQL HA in the cloud
 
Postgrest: the REST API for PostgreSQL databases
Postgrest: the REST API for PostgreSQL databasesPostgrest: the REST API for PostgreSQL databases
Postgrest: the REST API for PostgreSQL databases
 
Full slidescr16
Full slidescr16Full slidescr16
Full slidescr16
 
Use Ionic Framework to develop mobile application
Use Ionic Framework to develop mobile applicationUse Ionic Framework to develop mobile application
Use Ionic Framework to develop mobile application
 
Rabbitmq & Postgresql
Rabbitmq & PostgresqlRabbitmq & Postgresql
Rabbitmq & Postgresql
 
Jenkins djangovillage
Jenkins djangovillageJenkins djangovillage
Jenkins djangovillage
 
Geodjango and HTML 5
Geodjango and HTML 5Geodjango and HTML 5
Geodjango and HTML 5
 
PLV8 - The PostgreSQL web side
PLV8 - The PostgreSQL web sidePLV8 - The PostgreSQL web side
PLV8 - The PostgreSQL web side
 
Pg tap
Pg tapPg tap
Pg tap
 
Geodjango
GeodjangoGeodjango
Geodjango
 

Dernier

+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@
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 

Dernier (20)

+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...
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdf
 
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
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 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
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
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
 

Yui app-framework

  • 1. YUI! E l'App Framewok: l'MVC secondo Yahoo! Lucio Grenzi l.grenzi@gmail.com
  • 2. Who am I? • Delphi developer for 11 years • Now freelance and Asp.net developer • Javascript addicted Nonantolando.blogspot.com https://plus.google.com/108943068354277861330 http://it.linkedin.com/pub/lucio-grenzi/27/2bb/2a Lucio Grenzi 2 l.grenzi@gmail.com – Freelance
  • 3. Who am I? • Delphi developer for 11 years • Now freelance and Asp.net developer • Javascript addicted Nonantolando.blogspot.com https://plus.google.com/108943068354277861330 http://it.linkedin.com/pub/lucio-grenzi/27/2bb/2a Lucio Grenzi 3 l.grenzi@gmail.com – Freelance
  • 4. Agenda • Brief introduction Yui • What's new on Yui 3.4.x • How App framework works • What's expected on Yui 3.5 Lucio Grenzi 4 l.grenzi@gmail.com – Freelance
  • 5. YUI is a free, open source JavaScript and CSS framework for building richly interactive web applications. • Fast • Complete • Industrial Strength • Free & Open Lucio Grenzi 5 l.grenzi@gmail.com – Freelance
  • 6. One more javascript framework? • jQuery • ExtJS • Dojo • Yui • ….. Lucio Grenzi 6 l.grenzi@gmail.com – Freelance
  • 7. What's new on Yui 3.4 • The new Calendar component is now included in the build. This is a very early release consisting of Calendar’s core functionality. Skinning and additional features will continue to be added ahead of the 3.4.0 launch. • The App Framework, YUI’s new suite of MVC infrastructure components, is fully functional and ready for use. • ScrollView now supports vertical paging, includes a scrollview-list plugin to add CSS classnames to immediate list elements, as well several bug fixes and refactoring • You will also find updates to the Graphics API, performance enhancements in Base, bug fixes in Dial, and many more additions throughout the library. Lucio Grenzi 7 l.grenzi@gmail.com – Freelance
  • 8. Yui App framework = jQuery + Backbone.js ? • The YUI 3 app framework is heavily inspired by Backbone.js. • App framework is tightly integrated on the framework and takes advantage of YUI's fantastic custom event system and extensible component infrastructure Lucio Grenzi 8 l.grenzi@gmail.com – Freelance
  • 9. Yui App framework blocks • Model • Model list • View • Controller Lucio Grenzi 9 l.grenzi@gmail.com – Freelance
  • 10. Model is a lightweight Attribute-based data model with methods for getting, setting, validating, and syncing attribute values to a persistence layer or server, as well as events for notifying listeners of model changes. Lucio Grenzi 10 l.grenzi@gmail.com – Freelance
  • 11. Model list is an array-like ordered list of Model instances with methods for adding, removing, sorting, filtering, and performing other actions on models in the list. All events fired by a model automatically bubble up to all the lists that contain that model, so lists serve as convenient aggregators for model events. Lucio Grenzi 11 l.grenzi@gmail.com – Freelance
  • 12. View represents a renderable piece of an application's user interface, and provides hooks for easily subscribing to and handling delegated DOM events on a view's container element. Lucio Grenzi 12 l.grenzi@gmail.com – Freelance
  • 13. Controller provides URL-based same-page routing using HTML5 history (pushState) or the location hash, depending on what the user's browser supports. Lucio Grenzi 13 l.grenzi@gmail.com – Freelance
  • 14. Todo Model TodoModel = Y.TodoModel = Y.Base.create('todoModel', Y.Model, [], { sync: LocalStorageSync('todo'), toggleDone: function () { this.set('done', !this.get('done')).save(); } }, { ATTRS: { done: {value: false}, text: {value: ''} } }); Lucio Grenzi 14 l.grenzi@gmail.com – Freelance
  • 15. ToDo List TodoList = Y.TodoList = Y.Base.create('todoList', Y.ModelList, [], { model: TodoModel, sync : LocalStorageSync('todo'), done: function () { return Y.Array.filter(this.toArray(), function (model) { return model.get('done'); }); }, remaining: function () { return Y.Array.filter(this.toArray(), function (model) { return !model.get('done'); }); }}); Lucio Grenzi 15 l.grenzi@gmail.com – Freelance
  • 16. TodoAppView (1/2) TodoAppView = Y.TodoAppView = Y.Base.create('todoAppView', Y.View, [], { container: Y.one('#todo-app'), inputNode: Y.one('#new-todo'), template: Y.one('#todo-stats-template').getContent(), events: { '#new-todo': {keypress: 'createTodo'}, '.todo-clear': {click: 'clearDone'}, '.todo-item': { mouseover: 'hoverOn', mouseout : 'hoverOff' } } Lucio Grenzi 16 l.grenzi@gmail.com – Freelance
  • 17. TodoAppView (2/2) initializer: function () { var list = this.todoList = new TodoList(); list.after('add', this.add, this); list.after('reset', this.reset, this); list.after(['add', 'reset', 'remove', 'todoModel:doneChange'], this.render, this); list.load(); }, render: function () { var todoList = this.todoList, stats = this.container.one('#todo-stats'), numRemaining, numDone; if (todoList.isEmpty()) { stats.empty(); return this; } numDone = todoList.done().length; numRemaining = todoList.remaining().length; Lucio Grenzi 17 l.grenzi@gmail.com – Freelance
  • 18. TodoView (1/2) TodoView = Y.TodoView = Y.Base.create('todoView', Y.View, [], { container: '<li class="todo-item"/>', template: Y.one('#todo-item-template').getContent(), events: { '.todo-checkbox': {click: 'toggleDone'}, '.todo-content': { click: 'edit', focus: 'edit' }, '.todo-input' : { blur : 'save', keypress: 'enter' }, '.todo-remove': {click: 'remove'} } Lucio Grenzi 18 l.grenzi@gmail.com – Freelance
  • 19. TodoView (2/2) edit: function () { this.container.addClass('editing'); this.inputNode.focus(); }, enter: function (e) { if (e.keyCode === 13) { // enter key Y.one('#new-todo').focus(); } }, remove: function (e) { e.preventDefault(); this.constructor.superclass.remove.call(this); this.model.destroy({'delete': true}); }, save: function () { this.container.removeClass('editing'); this.model.set('text', this.inputNode.get('value')).save(); }, toggleDone: function () { this.model.toggleDone(); } Lucio Grenzi 19 l.grenzi@gmail.com – Freelance
  • 20. LocalStorageSync (1/2) function LocalStorageSync(key) { var localStorage; if (!key) { Y.error('No storage key specified.'); } if (Y.config.win.localStorage) { localStorage = Y.config.win.localStorage;} var data = Y.JSON.parse((localStorage && localStorage.getItem(key)) || '{}'); function destroy(id) { var modelHash; if ((modelHash = data[id])) { delete data[id]; save(); } return modelHash; } Lucio Grenzi 20 l.grenzi@gmail.com – Freelance
  • 21. LocalStorageSync (2/2) return function (action, options, callback) { var isModel = Y.Model && this instanceof Y.Model; switch (action) { case 'create': // intentional fallthru case 'update': callback(null, set(this)); return; case 'read': callback(null, get(isModel && this.get('id'))); return; case 'delete': callback(null, destroy(isModel && this.get('id'))); return; } }; Lucio Grenzi 21 l.grenzi@gmail.com – Freelance
  • 22. What's next? (3.5.0) • Y.Controller is now Y.Router • New route handler signature • Some properties are now attributes • Documentation updated Lucio Grenzi 22 l.grenzi@gmail.com – Freelance
  • 23. References • http://yuilibrary.com/projects/yui3/ • https://github.com/yui/yui3 • http://yuilibrary.com/yui/docs/app/app-todo.html • http://www.yuiblog.com/blog/2011/12/12/app-framework-350/ Lucio Grenzi 23 l.grenzi@gmail.com – Freelance
  • 24. Questions? Lucio Grenzi 24 l.grenzi@gmail.com – Freelance
  • 25. Thank you Creative Commons via tcmaker.org Lucio Grenzi 25 l.grenzi@gmail.com – Freelance