View Basics
Creating and Attaching a View
This example demonstrates the basic usage of Giraffe.View. It can be extended just like a Backbone.View.
var MyView = Giraffe.View.extend({
template: '#my-template',
serialize: function() {
return {name: 'my view'};
}
});
Giraffe implements render
so it can do some useful things, and by default
render
expects a view's template
to be the DOM selector of an Underscore
template. This can be easily configured to support any form of string
templating. For more information, see template
, setTemplateStrategy
, and
templateStrategy
in the API docs or the
Template Strategies example. The included strategies
use a view's serialize
function to get the data passed into the template.
<script id="my-template" type="text/template">
Hello <%= name %>!
</script>
Giraffe uses the function attachTo
to put views into the DOM or inside one
another. If a view has not yet been rendered, attachTo
will call render
on
it.
var myView = new MyView();
myView.attachTo('body');
Here's the result:
var MyView = Giraffe.View.extend({
template: '#my-template',
serialize: function() {
return {
name: 'my view'
};
}
});
var myView = new MyView();
myView.attachTo('body');
<!DOCTYPE html>
<html>
<head>
<link rel='stylesheet' type='text/css' href='../css/reset.css' />
</head>
<body>
<script id="my-template" type="text/template">
Hello <%= name %>!
</script>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.4/underscore-min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.0.0/backbone-min.js"></script>
<script src="../backbone.giraffe.js" type="text/javascript"></script>
<script type='text/javascript' src='viewbasics0-script.js'></script>
</body>
</html>
Creating Child Views
This example demonstrates how the attachTo
function automatically sets up
parent-child relationships between views.
Giraffe calls the functions beforeRender
and afterRender
every time a
view renders. These are empty functions for your views to fill in. afterRender
is a good place to create and attach child views.
var ParentView = Giraffe.View.extend({
template: '#parent-template',
afterRender: function() {
var childView = new ChildView({name: 'child view'});
childView.attachTo(this);
// or
// this.attach(childView);
}
});
<script id="parent-template" type="text/template">
parent view
</script>
The ChildView
will be put inside the ParentView
.
var ChildView = Giraffe.View.extend({
template: '#child-template'
});
The ChildView
simply displays the name
provided in its options
. We aren't
defining a serialize
method on the ChildView
, and by default, serialize
passes the view to the template function.
<script id="child-template" type="text/template">
<%= name %>
</script>
Let's create and attach the parent view.
var parentView = new ParentView();
parentView.attachTo('body');
Now is a good time to inspect the views to see what the child-parent
relationship looks like. The parent has an array of children
and the children
have a reference to their parent
.
var childView = parentView.children[0];
console.log(parentView === childView.parent); // => true
Let's create a second child view. The method
option of attachTo
is the
jQuery method used to insert the view. The default is 'append'
. In this
case we'll use 'before'
to put it before the first child view we created. See
attachTo
in the API docs for more.
var childView2 = new ChildView({name: 'child view attached with {method: "before"}'});
childView2.attachTo(childView, {method: 'before'});
The parent
of childView2
is the parentView
.
console.log(childView2.parent === parentView); // => true
Here's the result:
var ParentView = Giraffe.View.extend({
template: '#parent-template',
afterRender: function() {
var childView = new ChildView({
name: 'child view'
});
childView.attachTo(this);
// or
// this.attach(childView);
}
});
var ChildView = Giraffe.View.extend({
template: '#child-template'
});
var parentView = new ParentView();
parentView.attachTo('body');
var childView = parentView.children[0];
console.log(parentView === childView.parent); // => true
var childView2 = new ChildView({
name: 'child view attached with {method: "before"}'
});
childView2.attachTo(childView, {
method: 'before'
});
console.log(childView2.parent === parentView); // => true
<!DOCTYPE html>
<html>
<head>
<link rel='stylesheet' type='text/css' href='../css/reset.css' />
<link rel='stylesheet' type='text/css' href='viewbasics1-style.css' />
</head>
<body>
<script id="parent-template" type="text/template">
parent view
</script>
<script id="child-template" type="text/template">
<%= name %>
</script>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.4/underscore-min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.0.0/backbone-min.js"></script>
<script src="../backbone.giraffe.js" type="text/javascript"></script>
<script type='text/javascript' src='viewbasics1-script.js'></script>
</body>
</html>
[data-view-cid] {
position: relative;
padding: 20px;
margin: 20px;
border: 1px dashed #999;
}
attachTo
Sequence Diagram
participant MyView
participant GView as "Giraffe.View"
MyView -> GView: attachTo #container
alt if #container has parent view
GView -> ParentView: set MyView as child of parent
end
GView -> DOM: detach MyView's $el
alt if method is 'html'
GView -> GView: detach views inside #container
end
GView -> DOM: put MyView's $el in #container using method
alt if MyView not yet rendered or options.forceRender
alt if beforeRender overridden
GView -> MyView: beforeRender()
end
GView -> GView: $el.empty()
GView -> MyView: templateStrategy()
MyView --> GView: return html string
GView -> DOM: append html string to $el
alt if afterRender overridden
GView -> MyView: afterRender()
end
end