A complete development stack for HTML5 mobile applications, including backbone.js, phonegap, trigger.io, jquery mobile, sencha touch, jqmobi, require.js, and mustache templating.
interface. CSS3 is very powerful, easy and flexible compared to Android and iPhone UI libraries. More control and flexibility (for example, PhoneGap does not export all native abilities). Easy to patch / update because only web assets need to be replaced. You will need to write Javascript to native interfaces if your back-end / business logic is already programmed using native code All you need to know is Javascript for all platforms. Static elements and transitions are still laggy.
have a complicated, good looking user interface, and if you need it fast ! User native UI when you need very CPU intensive, sleek interface, and you are willing to invest a lot of work on it ! Use a combination of both to gain both advantages! Use native static elements (header, footer, page frames and page transitions), and program the actual user interface in WebViews
mobile apps ! Write your program once, and compile an app for Android, iPhone, BlackBerry, Windows Phone, and more… ! Exports Javascript APIs for native phone control (camera, GPS, filesystem, etc.) and has plugins
Has a utility called forge which does the app building for you, instead of opening 3 completely different IDEs to do it yourself ! Claims to outperform PhoneGap native bridge by x5 ! You should choose it if you can write your program in Javascript only (no plugins) ! Good for web, too!
of your mobile UI using a web framework, you should use a UI framework which saves time with mobile-looking components ! jQuery Mobile – Free, heavily backed by the community ! http://jquerymobile.com/ ! Sencha Touch – Commercial, robust ! http://www.sencha.com/products/touch ! jqMobi – Haven’t tried it, but it looks promising in terms of performance, which is the Achilles heel of mobile web UI ! http://www.jqmobi.com/ ! http://www.youtube.com/watch?v=MwNdWZsRXgk
new device which supports real fixed toolbars, or you simulate the scroll ! jQuery goes with real toolbars & fallback support. Fallbacks to statically positioned toolbars ! Sencha Touch goes for compatibility and simulates the scroll by moving the body up instead of letting the page scroll down ! If you really want both performance and compatibility - the best solution would probably be… to use native toolbars
you can use whatever you want for DOM manipulation ! Evolved a lot in the past year and is ready for real world development ! Although performance has improved a lot, it’s still not amazing. You might want to do a little more research
– has automatic updating templates, which are voodooish, and bindings work a bit different ! Ember should be nicer to program with, but Backbone gives more control and performance
! It is a protocol which servers implement to give control of the state of a data set (a collection of data items) ! REST maps CRUD operations to HTTP operations ! Collection Operations ! HTTP GET = Read ! HTTP POST = Create ! Model Operations ! HTTP PUT = Update ! HTTP DELETE = Delete
Backbone.Model DOM Manipulation With jQuery and templating DOM View Events Backbone REST Sync Server Model Database Model Events Model updated according to user interaction
when specific models are updated or deleted. ! Without regarding views, Backbone also automatically synchronizes models back to the server on every change Model Server
from the server ! A “reset” event is fired when results from the server return Collection Server tasks.fetch();! tasks.bind(“reset”, this.addTaskViews); ! HTTP GET /tasks! Model Model Model
which creates a new model Model Model Model Collection Server New Model tasks.create({! title: “Hello, world!”,! done: false! });! tasks.bind(“add”, this.addTaskView)! HTTP POST /tasks! New task ID: 3! New Model
View Model View Collection PUT /tasks/41 DELETE /tasks/41 PUT /tasks/39 DELETE /tasks/39 PUT /tasks/40 DELETE /tasks/40 PUT /tasks/38 DELETE /tasks/38 GET /tasks POST /tasks Collection Operations Model Operations
collection of models, and are responsible for managing their child views ! Backbone creates a DOM element with a specific class for every new view, using the tagName and className tags ! Or, Backbone can use a view which already exists in the DOM, if el is defined Backbone.View.extend({ tagName : “div”, className: “section” }) Backbone.View.extend({ el: $(“#main-view”); }) … <div id=“main-view”></div>
class of Backbone, since it’s actually an MVC controller. (Bad choice of words. Check out spine.js for a better choice) ! It translates the user actions into model changes ! It updates the view when a model is changed
changed by binding on model change events, so we’ll know we need to update it var todoItemView = Backbone.View.extend({ tagName: “div”, className: “todo”, model: todoModel, initialize: function() { _.bindAll(this, “update”); this.model.bind(“change”, this.update); } }); View Model
you must implement and call its render function to build its inner elements ! You can implement the render function in 3 ways 1. Don’t implement it – if you are using an existing element 2. Use jQuery or another DOM library to build the inner elements using code – results in ugly and unreadable code 3. Use a template to render the view – preferred method
logic-less templating library ! Supports a wide range of languages ! Simple syntax, yet powerful ! Supports loops ! You can use underscore.js templates, but they are not as strong
to fill our element with the rendered template ! Use Mustache.render with the view template text , along with the models’ data (we use toJSON to serialize the model data so the template engine can use it). Backbone.View.extend({ render: function() { $(this.el).html( Mustache.render(todoItemTemplate, this.model.toJSON())); } ); View Template Model Mustache
may use two methods: 1. If you are using a template, you may use the render function with the updated attributes again 2. Acquire handles to the DOM elements you created in the render function and update each of them according to the change. ! The first method is a lot easier to implement, but when you need performance, you should later on move to option #2.
views before confirmation from server ! Gives better user experience ! Wait mode ! Creates/updates views after confirmation from server ! Safer method ! If you have business logic related to how your entities are created which implicates on the views, you cannot use optimistic mode
https://github.com/ronreiter/webapp-boilerplate ! RequireJS loads “AMD” modules (Asynchronous Module Definition” as opposed to the company J) ! Normal modules add a global variable (jQuery adds $ for example), or add method over a global variable (like jQuery plugins). ! This means that you CANNOT use normal libraries, without wrapping them first. ! I‘ve wrapped them for you, so just download my boilerplate and use it.
is that it knows how to load text files along with the modules, so you can simply write your client side template files separately, and load them when you need them define([“backbone”, “underscore”, “jquery”, “text!listview.html”], function(Backbone, _, $, listViewTemplate) { … Mustache.render(listViewTemplate, this.model.toJSON()) …
run a utility called r.js (part of RequireJS) on your main script ! r.js is a node executable script ! It will turn all of your modules into one single, minified file ! Creating an application manifest is required JS JS JS JS min JS node r.js