DoneJS StealJS jQuery++ FuncUnit DocumentJS
5.33.3
6.0.0 4.3.0 3.14.1 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-bind
      • can-compute
      • can-debug
      • can-define
      • can-define/list/list
      • can-define/map/map
      • can-define-backup
      • can-define-stream
      • can-define-stream-kefir
      • can-event-queue
      • can-kefir
      • can-list
      • can-map
      • can-map-compat
      • can-map-define
      • can-observable-array
      • can-observable-object
      • can-observation
      • can-observation-recorder
      • can-observe
      • can-simple-map
      • can-simple-observable
      • can-stream
      • can-stream-kefir
      • can-value
    • Views
      • can-attribute-observable
      • can-component
        • define
          • extend
          • tag
          • view
          • ViewModel
        • create
          • <tag bindings...>
          • new Component
        • elements
          • <can-slot>
          • <can-template>
        • lifecycle hooks
          • connectedCallback
        • deprecated
          • beforeremove
          • <content>
          • events
          • helpers
          • leakScope
          • viewModel
      • can-stache
      • can-stache-bindings
      • can-stache-converters
      • can-stache-element
      • can-stache-route-helpers
      • can-view-autorender
      • can-view-callbacks
      • can-view-import
      • can-view-live
      • can-view-model
      • can-view-nodelist
      • can-view-parser
      • can-view-scope
      • can-view-target
      • steal-stache
    • Data Modeling
      • can-connect
      • can-connect-feathers
      • can-connect-ndjson
      • can-connect-tag
      • can-fixture
      • can-fixture-socket
      • can-local-store
      • can-memory-store
      • can-ndjson-stream
      • can-query-logic
      • can-realtime-rest-model
      • can-rest-model
      • can-set-legacy
      • can-super-model
    • Routing
      • can-deparam
      • can-param
      • can-route
      • can-route-hash
      • can-route-mock
      • can-route-pushstate
    • JS Utilities
      • can-assign
      • can-define-lazy-value
      • can-diff
      • can-globals
      • can-join-uris
      • can-key
      • can-key-tree
      • can-make-map
      • can-parse-uri
      • can-queues
      • can-string
      • can-string-to-any
      • can-zone-storage
    • DOM Utilities
      • can-ajax
      • can-attribute-encoder
      • can-child-nodes
      • can-control
      • can-dom-data
      • can-dom-events
      • can-dom-mutate
      • can-event-dom-enter
      • can-event-dom-radiochange
      • can-fragment
    • Data Validation
      • can-define-validate-validatejs
      • can-type
      • can-validate
      • can-validate-interface
      • can-validate-legacy
      • can-validate-validatejs
    • Typed Data
      • can-cid
      • can-construct
      • can-construct-super
      • can-data-types
      • can-namespace
      • can-reflect
      • can-reflect-dependencies
      • 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

extend

  • Edit on GitHub

Define the behavior of a custom element.

Component.extend(prototype)

Extends the Component constructor function with prototype properties and methods. Registers the component by its tag with can-view-callbacks.tag.

<tag-name></tag-name>
<script type="module">
import {Component} from "can";

Component.extend( {
  tag: "tag-name",
  ViewModel: { /* ... */ },
  view: ` VIEW CONTENT `
} );
</script>

Parameters

  1. prototype {Object}:

    An object set as the prototype of the constructor function. You will typically provide the following values on the prototype object:

    • tag {tag} - Defines the tag on which instances of the component constructor function will be created.

    • ViewModel {ViewModel} - Specifies an object that is used to render the component’s view.

    • view {view} - Specifies the view rendered within the custom element.

    And sometimes the following values are provided:

    • events {events} - Defines events on dom elements or observable objects the component listens to.

    • helpers {helpers} - Specifies mustache helpers used to render the component’s view.

Returns

{Component}:

Returns a component constructor function. The constructor function has the view and ViewModel available for testing:

import {Component} from "can";

const MyComponent = Component.extend( {
  tag: "my-component",
  view: `<div>You are {{this.age}}</div>`,
  ViewModel: { age : "number" }
} );

console.log( MyComponent.view({age: 5}).firstChild.innerHTML )
//-> "You are 5"

var myComponentVM = new MyComponent.ViewModel({age: "5"});
console.log(myComponentVM.age) //-> 5

Inheriting Components

Inheriting from components works differently than other CanJS APIs. You can’t call .extend on a particular component to create a “subclass” of that component.

Instead, components work more like HTML elements. To reuse functionality from a base component, build on top of it with parent components that wrap other components in their view and pass any needed viewModel properties via attributes.

If you really want to extend a component you can do it as follows:

<extending-component age:from="36" extended:from="true"></extending-component>
<script type="module">
import {Component} from "can";

const MyComponent = Component.extend( {
    tag: "my-component",
    view: `<div>You are {{this.age}}</div>`,
    ViewModel: { age : "number" }
} );

const ExtendingComponent = Component.extend({
    tag: "extending-component",
    view: `Extended content {{this.extended}}.  {{baseView(this)}}`,
    ViewModel: MyComponent.ViewModel.extend({
        baseView: {
            default(){
                return MyComponent.view
            }
        },
        extended: "boolean"
    })
});
</script>

Timing

Components with hyphenated tag names can be extended anytime before a can-stache view that uses them is rendered. This means that templates can be defined before the component as follows:

import {Component, stache} from "can";

const view = stache(`<my-component/>`);

Component.extend({
    tag: "my-component",
    view: `Component Mounted`
});

document.body.appendChild( view() );

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

On this page

Get help

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