# save

This method sends ready-to-save data changes to the server (normally using server.set, unless it's undefined, then with server.create) For a store with idProperty defined when the value of that property is falsy and allowCreate=true, uses server.create instead.

It returns a Promise which resolves (after server responds with the result and the model is updated) with true if save was actually performed (with errors or not) and false if save was skipped (i.e. no changes since last save or refresh or no changes ready to be sent as they failed validation or create is needed but allowCreate is false).

> **IMPORTANT: Both manual calls to save() and the auto-save facility will send all changed data properties that are not in error, regardless of whether other properties failed validation and model.status.canSave is false.**

This method is often set up to run when user navigates away from the form (i.e. componentWillUnmount) or the app is paused so the user's work is saved.

Calls to save() while one is in progress are queued.

Note that FormStore does not have any built-in timeout facilities - it's up to the server.set/create methods to reject if no response is received from the server within some reasonable period of time.

FormStore instance save() method takes a single optional Object-type argument - saveOptions.

## saveOptions

| Option                  | Data type | Default | Description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| ----------------------- | --------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| allowCreate             | Boolean   | false   | This option controls the behavior of save() when the model has a non-null idProperty and the last value received from server for that property is falsy, which means save() needs to call server.create instead of server.set. Your form may be set up to call save() when user navigates away from it to preserve their work. However, in a create scenario, submitting possibly partial data is undesirable. Therefore, by default, when save() needs to create and allowCreate=false, save() will do nothing. **To enable save() to call server.create(), you must call save() with allowCreate: true. So be sure to set up your actual form Save button to do this.** |
| saveAll                 | Boolean   | false   | If true, save() will send the entire data object to server.set/create including any properties that failed validation and save will be performed even if no data has changed.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| skipPropertyBeingEdited | Boolean   | false   | When auto-save calls save() it sets this to true, which results in omitting the property that the user is currently editing from being sent to the server. See startEditing()/stopEditing() [methods](/mobx-forms/formstore/formstore-methods.md#startediting).                                                                                                                                                                                                                                                                                                                                                                                                           |
| keepServerError         | Boolean   | false   | When auto-save calls save() it sets this to true so it doesn't clear the last error message from the server if any, which is what normally happens in every save() call right *before* the call to server.set/create. Note that even when this is true, the server error will still be updated or cleared but *after* the server responds, so the purpose of this parameter is to keep the UI from flickering during each auto-save.                                                                                                                                                                                                                                      |

You can include additional properties in saveOptions for use by the beforeSave callback, which receives the entire saveOptions object as its third argument.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://alexhisen.gitbook.io/mobx-forms/formstore/formstore-methods/formstore-save.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
