Skip to content

Model

A model instance usually represents a single entity record. See the class.

Methods

set

Sets an attribute or multiple attributes.

model.set('attributeName', value);

model.set({
    attributeName1: value1,
    attributeName2: value2,
});

// Options.
model.set(attributes, {
    'silent': true, // suppresses 'change' events
});

You can pass custom options and check them in 'change' event listeners.

get

Gets an attribute.

const value = model.get('attributeName');

// all attributes
const attributes = Espo.Utils.cloneDeep(model.attributes);

save

Saves a model (to the back-end).

// Assuming model.id is set.
model.save()
    .then(() => {
        // callback on success
    })
    .catch(() => {
        // callback on fail
    });

fetch

Fetches a model (from the backend). Loads attribute values to the model. Returns a promise.

// assuming model.id is set
model.fetch()
    .then(() => {
    });

getClonedAttributes

Get cloned attributes. Returns an object.

const attributes = model.getClonedAttributes();

populateDefaults

Populate default values.

setDefs

Sets field and link defs. May be needed if a model instantiated explicitly, not by the factory.

model.setDefs({
    fields: {},
    links: {},
};

Properties

id

string

A record ID.

entityType

string

An entity type.

urlRoot

string

A root API URL to use for syncing with the backend. For non-new records, an ID part will be appended.

url

string

An API URL to use for syncing with the backend. If specified, urlRoot will be omitted.

attributes

Record

Attribute values.

const name = model.attributes.name;

Instantiating

Model-factory is available in views. The model-factory allows to create a model instance of a specific entity type.

define('custom:views/some-custom-view', ['view'], (View) => {

    return class extends View {

        setup() {            
            // Use wait to hold off rendering until model is loaded.     
            this.wait(this.loadModel());
        }

        async loadModel() {
            this.model = await this.getModelFactory().create('Account');

            // entityType is set by the factory.
            //const entityType = this.model.entityType;

            this.model.id = this.options.id;

            await model.fetch(); 
        }
    }
})

Instantiating w/o factory:

define('custom:views/some-custom-view', ['view', 'model'], (View, Model) => {

    return class extends View {

        setup() {
            const model = new Model();

            // URL will be used when fetching and saving.
            model.urlRoot = 'MyModel'; 
            model.id = 'someId';

            this.wait(
                // This performs `GET MyModel/someId` API call.
                model.fetch(); 
            );
        }
    }
})

Events

Note: listenTo and listenToOnce are methods of the view class.

change

When model attributes get changed (not necessarily synced with backend).

this.listenTo(model, 'change', (model, options) => {
    if (this.model.hasChanged('someAttribute')) {
        // someAttribute is changed
    }

    if (options.ui) {
        // changed via UI
        // this options is set by field view
    }
});

this.listenToOnce(model, 'change:someAttribute', (model, value, options) => {
    // someAttribute is changed
});

sync

Model synced with backend.

this.listenTo(model, 'sync', (model, response, options) => {
    // synced with backend (fired after fetch or save)
});

destroy

Once model is removed (after DELETE request).

Additional events

Defined in the application.

after:relate

Once relationship panel updated. Available on detail/edit views.

update-all

This event is not fired. But you can fire it to update all relationship panels. Available on detail/edit views.

Other

Passing model to a child view:

this.createView('someName', 'custom:views/some-view', {
    model: this.model,
});