DoneJS StealJS jQuery++ FuncUnit DocumentJS
3.14.1
5.0.0 4.3.0 2.3.35
  • About
  • Guides
  • API Docs
  • Community
  • Contributing
  • Bitovi
    • Bitovi.com
    • Blog
    • Design
    • Development
    • Training
    • Open Source
    • About
    • Contact Us
  • About
  • Guides
  • API Docs
    • Observables
      • can-compute
      • can-define
      • can-define/list/list
      • can-define/map/map
      • can-define-stream
      • can-define-stream-kefir
      • can-event
      • can-event/async/async
      • can-event/batch/batch
      • can-event/lifecycle/lifecycle
      • can-kefir
      • can-list
      • can-map
      • can-map-backup
      • can-map-define
      • can-observation
      • can-observe
      • can-simple-map
      • can-simple-observable
      • can-stream
      • can-stream-kefir
    • Data Modeling
      • can-connect
      • can-connect-cloneable
      • can-connect-feathers
      • can-connect-ndjson
      • can-connect-signalr
      • can-fixture
      • can-fixture-socket
      • can-ndjson-stream
      • can-set
    • Views
      • can-component
      • can-ejs
      • can-element
      • can-react-component
      • can-stache
      • can-stache/helpers/route
      • can-stache-bindings
      • can-stache-converters
      • can-view-autorender
      • can-view-callbacks
      • can-view-href
      • can-view-import
      • can-view-live
      • can-view-model
      • can-view-nodelist
      • can-view-parser
      • can-view-scope
      • can-view-target
      • react-view-model
      • react-view-model/component
      • steal-stache
    • Routing
      • can-deparam
      • can-param
      • can-route
      • can-route-pushstate
    • JS Utilities
      • can-assign
      • can-define-lazy-value
      • can-globals
      • can-key-tree
      • can-make-map
      • can-parse-uri
      • can-string
      • can-string-to-any
      • can-util
      • can-zone
      • can-zone-storage
    • DOM Utilities
      • can-ajax
      • can-attribute-encoder
      • can-control
      • can-dom-events
      • can-event-dom-enter
      • can-event-dom-radiochange
      • can-jquery
    • Data Validation
      • can-define-validate-validatejs
      • can-validate
      • can-validate-interface
      • can-validate-legacy
      • can-validate-validatejs
    • Typed Data
      • can-cid
      • can-construct
      • can-construct-super
      • can-namespace
      • can-reflect
      • can-reflect-promise
      • can-types
    • Polyfills
      • can-symbol
      • can-vdom
    • Core
    • Infrastructure
      • can-global
      • can-test-helpers
    • Ecosystem
    • Legacy
  • Community
  • Contributing
  • GitHub
  • Twitter
  • Chat
  • Forum
  • News
Bitovi

can-connect-cloneable

  • npm package badge
  • Star
  • Edit on GitHub

Makes mutable clones of can-connect’d maps. Changes to the clone save back to the original; likewise, changes to the original propagate to the clone.

makeCloneable(Type)

Makes Type cloneable by giving its instances a clone method.

import DefineMap from "can-define/map/map";
import makeCloneable from "can-connect-cloneable";

const MyDefineMap = DefineMap.extend( { name: "string" } );
makeCloneable( MyDefineMap );

const original = new MyDefineMap( { name: "Kyle" } );
const clone = original.clone();
clone.name; // -> "Kyle"

Parameters

  1. Type {can-map|can-define/map/map}:

    The DefineMap or CanMap you want to make clonable

Use

can-connect-cloneable can be used with DefineMaps or legacy CanMaps. To make Map instances clonable, include can-connect-cloneable and call it with the Map constructor as the parameter. This adds a clone method to future instances of Map.

An instance and its clone have a special relationship:

  1. Changes to the original instance propogate automatically to the clone.
  2. Changes to the cloned instance do not propogate to the original until you call the clone’s save method.

Using DefineMap (can-define/map/map)

Apply the mixin:

import makeCloneable from "can-connect-cloneable";
import DefineMap from "can-define/map/map";
import connect from "can-connect";

// Extend DefineMap
const MyDefineMap = DefineMap.extend( { name: "string" } );

// create the connection
const connection = connect( [
    require( "can-connect/data/url/url" ),
    require( "can-connect/constructor/constructor" ),
    require( "can-connect/can/map/map" )
], {
    Map: MyDefineMap,
    url: "/api/endpoint"
} );

// apply the mixin
makeCloneable( MyDefineMap );

Use the clone method:

const original = new MyDefineMap( { name: "Kyle" } );
const clone = original.clone();

Make changes to the clone and save, updating the original:

// Change name on the clone instance
clone.name = "Justin";

// The value on the clone changes, but not the original value
original.name; // -> "Kyle"
clone.name; // -> "Justin"

// Once the clone is saved, the clone values propogate to the original
clone.save();
original.name; // -> "Justin"
clone.name; // -> "Justin"

Make changes to the original, updating the clone:

original.name; // -> "Justin"
clone.name; // -> "Justin"

// Change name on the original instance
original.name = "Kyle";

// The value on the clone changes automatically
original.name; // -> "Kyle"
clone.name; // -> "Kyle"

Using CanMap (can-map)

Apply the mixin:

import makeCloneable from "can-connect-cloneable";
import CanMap from "can-map";
require( "can-map-define" );
import connect from "can-connect";

// Extend CanMap
const MyCanMap = CanMap.extend( {
    define: {
        name: {
            type: "string"
        }
    }
} );

// create the connection
const connection = connect( [
    require( "can-connect/data/url/url" ),
    require( "can-connect/constructor/constructor" ),
    require( "can-connect/can/map/map" )
], {
    Map: MyCanMap,
    url: "/api/endpoint"
} );

// apply the mixin
makeCloneable( MyCanMap );

Use the clone method:

const original = new MyCanMap( { name: "Kyle" } );
const clone = original.clone();

Make changes to the clone and save, updating the original:

// Change name on the clone instance
clone.attr( "name", "Justin" );

// The value on the clone changes, but not the original value
original.attr( "name" ); // -> "Kyle"
clone.attr( "name" ); // -> "Justin"

// Once the clone is saved, the clone values propogate to the original
clone.save();
original.attr( "name" ); // -> "Justin"
clone.attr( "name" ); // -> "Justin"

Make changes to the original, updating the clone:

original.attr( "name" ); // -> "Justin"
clone.attr( "name" ); // -> "Justin"

// Change name on the original instance
original.attr( "name", "Kyle" );

// The value on the clone changes automatically
original.attr( "name" ); // -> "Kyle"
clone.attr( "name" ); // -> "Kyle"

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

On this page

Get help

  • Chat with us
  • File an issue
  • Ask questions
  • Read latest news