Data Binding

Setup

Tabris provides a JSX/decorators-based declarative data binding via the 'tabris-decorators' extension, which has to be installed in addition to the tabris module:

npm install tabris-decorators

This extension works only with TypeScript/JSX projects. Mixed projects work as well, but the modules using the extension need to be .ts or .tsx files. It’s strongly recommended to familiarize yourself with the basic decorators syntax if you aren’t already.

Basic Principles

Data binding in the context of Tabris.js/tabris-decorators refers to a set of APIs that assists you in writing custom UI components (like forms, lists or custom input elements) that provide a type-safe public API that interacts with the internal child elements of the component. This is done either with one-way bindings in which the value of a component property is applied to a child element, or two-way bindings that synchronizes a component property with a child element property.

A very simple example app using both, one-way and two-way bindings, can be found here.

Bindings can also be established with properties of non-widget object that are attached to a component. In one-way bindings the values may also be be converted or transformed before they are applied to the child element.

Both flavors of bindings rely on property change events to detect changes in the objects involved. The framework can assist you with this as well. In case a specific requirement of your component can not be handled via data binding it also provides easy and safe direct access to any child element.

The Decorators

The following data binding related decorators are exported by tabris-decorators:

  • @component - Class decorators that enables data binding within a custom component.
  • @property - Makes any property a valid source of one-way bindings.
  • @bind - Configures a custom component property for two-way bindings.
  • @event - Auto-initializes a Listeners properties to create a type-safe (change) event APIs.
  • @getById - Auto-initializes a (usually private) custom component property for direct access to a child element.