slides - JS(Saturday)

advertisement
MVVM/MVC in Client-side SPA
var subTitle = {
value: ‘Single page application approaches and usage’,
speaker1: ‘Stanimir Todorov, Product Developer Infragistics’,
speaker2: ‘Konstantin Dinev, Software Engineer Infragistics’
};
Contents




Past vs. present
Usage
Approaches
Frameworks and libraries
 Knockout.js
 Backbone.js
 Hands on
Past vs. present
 Past
 Static HTML
 Server rendered HTML
 Present
 JavaScript
Example
Example
Example
Usage
Improve
User
Experience
Approaches
 AJAX
 Server API
 JSON / XML / AJAX
Frameworks and libraries
 Libraries
 Knockout.js
 Frameworks
 Backbone.js
 Angular.js
MVVM




Handles single or multiple ViewModels
Observer pattern
DOM elements bind to the model
Built-in templating
Example
// Here's my data model
var ViewModel = function(first, last) {
this.firstName = ko.observable(first);
this.lastName = ko.observable(last);
this.fullName = ko.computed(function() {
// Knockout tracks dependencies automatically. It knows that fullName depends on
firstName and lastName, because these get called when evaluating fullName.
return this.firstName() + " " + this.lastName();
}, this);
};
ko.applyBindings(new ViewModel("Planet", "Earth")); // This makes Knockout get to work
Hands on Knockout.js
MVC
Overview







Models
Views
Collections
RESTful Persistence
Events
Routers
Dependencies
Model Example
var Task = Backbone.Model.extend({});
var task = new Task({title: “Fix Bugs”});
var title = task.get(“title");
Model Concepts




Default values
Getters & Setters
Listening for changes to your model
Validation
View Example
 Template
<script type="text/template" id=“task-template">
<div class="view">
<p>Title: <input type="text" value="<%= title%>"/></p>
</div>
</script>
 Rendering Container
<div id="container">Your task goes here.</div>
 Define the script
var TaskView = Backbone.View.extend({
el: '#container',
model: task,
template: _.template($("#task-template").html()),
initialize: function(){this.render();},
render: function(){this.$el.html(this.template(this.model.toJSON()));}
});
// initialize view
new TaskView();
Collections Example
var TasksCollection = Backbone.Collection.extend({
model: Task
});
var myTask = new Task({title:'Read the whole book', id: 2});
var tasks = new TasksCollection([myTask]);
Collections Concepts






Adding / Removing Models
Retrieving Models
Listening for events
Resetting / Refreshing
Underscore utility functions
Chainable API
RESTful Persistence
 Fetching models
 Saving models to the server
 Deleting models from the server
Events Example 1 / 2
var task = {};
// Mixin
_.extend(task, Backbone.Events);
// Add a custom event
task.on(‘completed’, function(msg){…});
// Trigger the custom event
task.trigger(‘completed‘, 'our event');
// Removes event bound to the object
obj.off(‘completed’)
Events Example 2 / 2
var a = _.extend({}, Backbone.Events);
var b = _.extend({}, Backbone.Events);
var c = _.extend({}, Backbone.Events);
// add listeners to A for events on B and C
a.listenTo(b, 'anything', function(event){ console.log("anything happened"); });
a.listenTo(c, 'everything', function(event){ console.log("everything happened"); });
// trigger an event
b.trigger('anything'); // logs: anything happened
// stop listening
a.stopListening();
// A does not receive these events
b.trigger('anything');
c.trigger('everything');
Router Example
var TaskRouter = Backbone.Router.extend({
/* define the route and function maps for this router */
routes: {
"about" : "showAbout",
"search/:query" : "searchTasks",
"search/:query/p:page" : "searchTasks"
},
showAbout: function(){…},
searchTasks: function(query, page){
var page_number = page || 1;
…
}
});
var myTaskRouter = new TaskRouter();
Backbone.history.start();
Dependencies
 Underscore || Lo-Dash
 Json2.js for RESTful (IE7), history support via Backbone.Router
and DOM manipulation with Backbone.View
 jQuery || Zepto
Hands on Backbone.js
Resources
 https://github.com/thomasdavis/backbonetutorials/blob/ghpages/videos/beginner/index.html
 https://github.com/addyosmani/todomvc/blob/ghpages/architecture-examples/backbone/js/views/app.js
 http://www.infragistics.com/community/blogs/nanil/archive/2013/
04/01/exploring-javascript-mv-frameworks-part-1-hellobackbonejs.aspx
 http://addyosmani.github.com/backbone-fundamentals/
 http://www.infragistics.com/products/jquery
 http://knockoutjs.com/
Expect very soon: SharePoint Saturday!
 Saturday, June 8, 2013
 Same familiar format – 1 day filled with sessions
focused on SharePoint technologies
 Best SharePoint professionals in the region
 Registrations will be open next week (15th)!
 www.SharePointSaturday.eu
Thanks to our Sponsors:
Diamond Sponsor:
Platinum Sponsors:
Gold Sponsors:
Swag Sponsors:
Media Partners:
Download