Mapping Request Data
A dataModel
is intended to help you manage data on an endpoint somewhere. To do this, Footwork needs to know where inside your dataModel
the data actually is, and how that maps to the server side. This is needed so it can properly construct the data for outbound requests as well as map that back to your dataModel
when it retrieves data.
Mapping Properties¶
To map properties in your dataModel
you use the .map()
method on an observable
, passing it the 'path' and instance to map.
function Person (personData) { // you must boot the dataModel prior to mapping any properties var self = fw.dataModel.boot(this, { url: '/person' }); self.name = fw.observable(personData.name).map('name', self); self.attr = { height: fw.observable(personData.height).map('attr.height', self), weight: fw.observable(personData.weight).map('attr.weight', self) }; } var batman = new Person({ name: 'Bruce Wayne', attr: { height: 6, weight: 220 } });
In the above example you see the name
property as well as height
and weight
under attr
. You will notice that height
and weight
are specified as properties of attr
via the full path (attr.height
/attr.weight
). This dot-notation is used to describe or map the data on the backend.
Footwork will use these mappings to translate your dataModel
to/from the form your backend uses. If fetching data from the server, the mappings will be used to determine what values from the response are written to what observables in your dataModel
. Conversely, if you are performing an operation that requires the data be sent upstream then Footwork uses the mappings to convert your dataModel
into its object literal form and then sending that over the wire.
Note
- Any
observable
property can be mapped. This includesobservable
,observableArray
,computed
, andcollection
properties. - The path of a mapped variable does not necessarily have to match the actual path inside of your
dataModel
(although you generally want that to be the case, to avoid confusion/inconsistencies).
Unmapping Properties¶
If you need to unmap a property, that is done with dataModel.$removeMap()
:
function Person (personData) { // you must boot the dataModel prior to mapping any properties var self = fw.dataModel.boot(this, { url: '/person' }); self.name = fw.observable(personData.name).map('name', self); self.attr = { height: fw.observable(personData.height).map('attr.height', self), weight: fw.observable(personData.weight).map('attr.weight', self) }; self.noName = function () { self.$removeMap('name'); // removes the mapped observable for 'name' }; }