events

  • property

Listen to events on elements and observables.

Object<eventDescription,eventHandler(element, event)()>

An object of event names and methods that handle the event. For example:

can.Component({
  events: {
    ".next click": function(){
      this.viewModel.next()
    }
  },
  viewModel: {
    next: function(){
      this.attr("offset", this.offset + this.limit);
    }
  }
})

A component's events object is used as the prototype of a can.Control. The control gets created on the component's element. The component's viewModel is available within event handlers as this.viewModel.

Use

can.Component's events object allows you to provide low-level can.Control-like abilities to a can.Component while still accessing can.Component's objects and methods like viewModel. The following example listens to clicks on elements with className="next" and calls .next() on the component's viewModel.

The events object can also listen to objects or properties on the component's viewModel. For instance, instead of using live-binding, we could listen to when offset changes and update the page manually:

Components have the ability to bind to special inserted and removed events that are called when a component's tag has been inserted into or removed from the page:

  events: {
    "inserted": function(){
      // called when the component's tag is inserted into the DOM 
    },
    "removed": function(){
      // called when the component's tag is removed from the DOM 
    }
  }

High performance template rendering

While can.view.bindings conveniently allows you to call a viewModel method from a template like:

<input ($change)="doSomething"/>

This has the effect of binding an event handler directly to this element. Every element that has a can-click or similar attribute has an event handler bound to it. For a large grid or list, this could have a performance penalty.

By contrast, events bound using can.Component's events object use event delegation, which is useful for high performance template rendering. In a large grid or list, event delegation only binds a single event handler rather than one per row.