can-map-define
Defines the
type
, initial value
, get
, set
, remove
, and serialize
behavior for attributes
of a Map.
Object
Use
The define plugin allows you to completely control the behavior
of attributes on a Map. To use it, you specify
an define
object that is a mapping of properties
to attribute definitions. The following example
specifies a Paginate Map:
var Paginate = Map.extend({
define: {
count: {
type: "number",
value: Infinity,
// Keeps count above 0.
set: function(newCount){
return newCount < 0 ? 0 : newCount;
}
},
offset: {
type: "number",
value: 0,
// Keeps offset between 0 and count
set: function(newOffset){
var count = this.attr("count");
return newOffset < 0 ?
0 :
Math.min(newOffset, !isNaN( count - 1) ?
count - 1 :
Infinity);
}
},
limit: {
type: "number",
value: 5
},
page: {
// Setting page changes the offset
set: function(newVal){
this.attr('offset', (parseInt(newVal) - 1) *
this.attr('limit'));
},
// The page value is derived from offset and limit.
get: function (newVal) {
return Math.floor(this.attr('offset') /
this.attr('limit')) + 1;
}
}
}
});
Default behaviors
The define plugin not only allows you to define individual attribute behaviors on a Map, but you can also define default behaviors that would apply to any unspecified attribute. This is particularly helpful for when you need a particular behavior to apply to every attribute on a Map but won't be certain of what every attribute will be.
The following example is a Map that is tied to route where only specified attributes that are serialized will be updated in the location hash:
var State = Map.extend({
define: {
foo: {
serialize: true
},
'*': {
serialize: false
}
}
});
var state = new State();
// tie State map to the route
route.map(state);
route.ready();
state.attr('foo', 'bar');
state.attr('bar', 'baz');
window.location.hash; // -> #!foo=bar
Overview
This plugin is a replacement for the now deprecated attributes and setter plugins. It intends to provide a single place to define the behavior of all the properties of a Map.
Here is the cliffnotes version of this plugin. To define...
- The default value for a property - use value
- That default value as a constructor function - use Value
- What value is returned when a property is read - use get
- Behavior when a property is set - use set
- How a property is serialized when serialize is called on it - use serialize
- Behavior when a property is removed - use remove
- A custom converter method or a pre-defined standard converter called whenever a property is set - use type
- That custom converter method as a constructor function - use Type
Demo
The following shows picking cars by make / model / year: