Awesome
Description
Backbone.Force is a plugin library that enables Force.com connectivity to Backbone.js Model and Collection types. In the back it uses forcetk library provided by Salesforce.com team.
Usage
To initialize it you need to call initialize function and pass it authorized forcetk.Client object:
Backbone.Force.initialize(forcetkClient);
Model
Defining Model type:
var Opportunity = Backbone.Force.Model.extend({
type:'Opportunity'
});
Fetching Model by Id:
var myOpp = new Opportunity({
Id:'OPPORTUNITY_ID'
});
myOpp.fetch({
success:function (model, response) {
alert('Fetched opportunity name: ' + model.get('Name'));
},
error:function (model, response) {
alert('Error fetching Opportunity!');
}
});
Updating Model (works exactly the same as Backbone.Model udpates):
myOpp.set('Name', 'New Opp name');
myOpp.save(null, {
success:function (model, response) {
alert('Model updated successfully!');
},
error:function (model, response) {
alert('Updating model failed!');
}
});
Optionally you can define which fields you would like to fetch:
var Opportunity = Backbone.Force.Model.extend({
type:'Opportunity',
fields:['Name', 'ExpectedRevenue']
});
Collection
Fetching multiple models requires defining new Collection type with model and query properties set. In this case query property should contain only WHERE soql clause.
var OppsCollection = Backbone.Force.Collection.extend({
// Model type
model:Opportunity,
// WHERE part of SOQL query
query:'WHERE IsWon = TRUE'
}),
myOppsCollection = new OppsCollection();
// Fetching all Opportunities
myOppsCollection.fetch({
success:function (collection, response) {
alert('Found: ' + collection.length + ' opps');
},
error:function (collection, response) {
alert('Fetching opportunities failed!');
}
});
Executing queries requies defining new Colleciton type with query property set.
var SOQLCollection = Backbone.Force.Collection.extend({
// SOQL query
query:'SELECT Id, Name, ExpectedRevenue, ' +
'(SELECT Subject, DurationInMinutes FROM Events), ' +
'Account.Id, Account.Name FROM Opportunity WHERE IsWon = TRUE'
}),
mySOQLCollection = new SOQLCollection();
// Executing query
mySOQLCollection.fetch({
success:function (collection, response) {
var accounts = [];
collection.each(function (model) {
// Only first level objects are mapped to Backbone.Model types, that is why Account is a standard JS object
accounts.push(model.get('Account').Name);
});
alert('Found accounts:\n\n' + accounts.join('\n'));
},
error:function (collection, response) {
alert('Executing SOQL query failed!');
}
});
Demo
Snippet below will work in Safari browser on desktop or on mobile device using PhoneGap/Cordova and ChildBrowser plugin. It uses yet another project of mine that is called forcetk.ui.
<!DOCTYPE html>
<html>
<head>
<title>forcetk.ui demo</title>
<script type="text/javascript" src="scripts/libs/jquery-1.8.1.js"></script>
<script type="text/javascript" src="scripts/libs/forcetk.js"></script>
<script type="text/javascript" src="scripts/libs/forcetk.ui.js"></script>
<script type="text/javascript" src="scripts/libs/underscore.js"></script>
<script type="text/javascript" src="scripts/libs/backbone.js"></script>
<script type="text/javascript" src="scripts/libs/backbone.force.js"></script>
<script type="text/javascript">
function login() {
// Salesforce login URL
var loginURL = 'https://login.salesforce.com/',
// Consumer Key from Setup | Develop | Remote Access
consumerKey = 'CONSUMER_KEY',
// Callback URL from Setup | Develop | Remote Access
callbackURL = 'https://login.salesforce.com/services/oauth2/success',
// Instantiating forcetk ClientUI
ftkClientUI = new forcetk.ClientUI(loginURL, consumerKey, callbackURL,
function forceOAuthUI_successHandler(forcetkClient) { // successCallback
console.log('OAuth success!');
var Force = Backbone.Force;
Force.initialize(forcetkClient);
// ********** Fetching Model **********
// Creating Opportunity type that maps to Salesforce Opportunity object
var Opportunity = Force.Model.extend({
type:'Opportunity',
fields:['Name', 'ExpectedRevenue']
}),
// Creating instance of Opportunity type with specified id
myOpp = new Opportunity({
Id:'006E0000004sgoo'
});
// Fetching opportunity with specified id
myOpp.fetch({
success:function (model, response) {
alert('Fetched opportunity name: ' + model.get('Name'));
},
error:function (model, response) {
alert('Error fetching Opportunity!');
}
});
// ********** Fetching Collection of Models **********
var OppsCollection = Force.Collection.extend({
model:Opportunity,
query:'WHERE IsWon = TRUE'
}),
myOppsCollection = new OppsCollection();
// Fetching all Opportunities
myOppsCollection.fetch({
success:function (collection, response) {
alert('Found: ' + collection.length + ' opps');
},
error:function (collection, response) {
alert('Fetching opportunities failed!');
}
});
// ********** Executing SOQL query **********
var SOQLCollection = Force.Collection.extend({
query:'SELECT Id, Name, ExpectedRevenue, ' +
'(SELECT Subject, DurationInMinutes FROM Events), ' +
'Account.Id, Account.Name FROM Opportunity WHERE IsWon = TRUE'
}),
mySOQLCollection = new SOQLCollection();
// Executing query
mySOQLCollection.fetch({
success:function (collection, response) {
var accounts = [];
collection.each(function (model) {
accounts.push(model.get('Account').Name);
});
alert('Found accounts:\n\n' + accounts.join('\n'));
},
error:function (collection, response) {
alert('Executing SOQL query failed!');
}
});
},
function forceOAuthUI_errorHandler(error) { // errorCallback
alert('OAuth error!');
});
// Initiating login process
ftkClientUI.login();
}
</script>
</head>
<body onload="login()">
<h3>Backbone.Force tests</h3>
</body>
</html>
Examples
- Used in GapForce project