DoneJS StealJS jQuery ++ FuncUnit DocumentJS
3.0.0
2.3.27

 

  • Github
  • Twitter
  • Chat
  • Forum
  • Guides
  • Core
  • Ecosystem
  • Infrastructure
  • Legacy
    • can-ejs
    • can-list
    • can-map
    • can-map-backup
    • can-map-define
      • Type
      • Value
      • type
      • attribute definition
      • get
      • remove
      • serialize
      • set
      • value
    • can-view-href
  • Bitovi
    • Bitovi.com
    • Blog
    • Consulting
    • Training
    • Open Source
  • Chat
  • Forum
  • Star
  • Follow @canjs
  • CanJS
  • /
  • Legacy
  • /
  • can-map-define
  • / On this page
    • can-map-define

      module

      Defines the type, initial value, get, set, remove, and serialize behavior for attributes of a Map.

      • npm package badge
      • Star
      • source

      plugin

      Options

      • define {Object<String,can.Map.prototype.define.attrDefinition>}:

        A map of attribute names to attribute definition objects.

      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 [can-map-attributes attributes] and [can-map-setter 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:

      CanJS is part of DoneJS. Created and maintained by the core DoneJS team and Bitovi. Currently 3.0.0.