2019-10-30 10:22:59 +01:00
|
|
|
# 🦉 Environment 🦉
|
|
|
|
|
|
2019-11-11 17:31:34 +01:00
|
|
|
## Content
|
|
|
|
|
|
|
|
|
|
- [Overview](#overview)
|
|
|
|
|
- [Setting an Environment](#setting-an-environment)
|
2019-11-26 13:20:54 +01:00
|
|
|
- [Using a sub environment](#using-a-sub-environment)
|
2019-11-11 17:31:34 +01:00
|
|
|
- [Content of an Environment](#content-of-an-environment)
|
|
|
|
|
|
|
|
|
|
## Overview
|
|
|
|
|
|
|
|
|
|
An environment is an object which contains a [`QWeb` instance](qweb_engine.md). Whenever
|
2019-10-31 22:45:22 +01:00
|
|
|
a root component is created, it is assigned an environment (see
|
|
|
|
|
[below](#setting-an-environment) for more info on this). This environment is
|
|
|
|
|
then automatically given to each sub component (and accessible in the `this.env`
|
|
|
|
|
property).
|
2019-10-30 10:22:59 +01:00
|
|
|
|
|
|
|
|
```
|
|
|
|
|
Root
|
|
|
|
|
/ \
|
|
|
|
|
A B
|
|
|
|
|
```
|
|
|
|
|
|
2019-11-11 17:31:34 +01:00
|
|
|
This way, all components share the same `QWeb` instance. Owl internally requires
|
|
|
|
|
that the environment has a `qweb` key which maps to a
|
|
|
|
|
[`QWeb`](qweb_engine.md) instance. This is the QWeb instance that will be used to
|
|
|
|
|
render each templates in this specific component tree. Note that if no `QWeb`
|
|
|
|
|
instance is provided, Owl will simply generate it on the fly.
|
2019-10-30 10:22:59 +01:00
|
|
|
|
2019-11-11 17:31:34 +01:00
|
|
|
The environment is mostly static. Each application is free to add anything to
|
|
|
|
|
the environment, which is very useful, since this can be accessed by each sub
|
|
|
|
|
component.
|
2019-10-30 10:22:59 +01:00
|
|
|
|
2019-10-31 22:45:22 +01:00
|
|
|
## Setting an environment
|
|
|
|
|
|
|
|
|
|
An Owl application needs an [environment](environment.md) to be executed. The
|
2019-11-11 17:31:34 +01:00
|
|
|
environment has an important key: the [QWeb](qweb_engine.md) instance, which will render
|
2019-10-31 22:45:22 +01:00
|
|
|
all templates.
|
|
|
|
|
|
|
|
|
|
Whenever a root component `App` is mounted, Owl will setup a valid environment by
|
|
|
|
|
following the next steps:
|
|
|
|
|
|
2020-01-09 09:31:35 +01:00
|
|
|
- take the `env` object defined on `App.env` (if no `env` was explicitly setup,
|
|
|
|
|
this will return the empty `env` object defined on `Component`)
|
2019-10-31 22:45:22 +01:00
|
|
|
- if `env.qweb` is not set, then Owl will create a `QWeb` instance.
|
|
|
|
|
|
|
|
|
|
The correct way to customize an environment is to simply set it up on the root
|
|
|
|
|
component class, before the first component is created:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
App.env = {
|
|
|
|
|
_t: myTranslateFunction,
|
|
|
|
|
user: {...},
|
|
|
|
|
services: {
|
|
|
|
|
...
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
const app = new App();
|
|
|
|
|
app.mount(document.body);
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
It is also possible to simply share an environment between all root components,
|
|
|
|
|
by simply doing this:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
Component.env = myEnv; // will be the default env for all components
|
|
|
|
|
```
|
2019-11-11 17:31:34 +01:00
|
|
|
|
2019-11-26 13:20:54 +01:00
|
|
|
Note that this environment is the global owl environment for an application. The
|
|
|
|
|
next section explains how to extend an environment for a specific sub component
|
|
|
|
|
and its children.
|
|
|
|
|
|
|
|
|
|
## Using a sub environment
|
|
|
|
|
|
|
|
|
|
It is sometimes useful to add one (or more) specific keys to the environment,
|
|
|
|
|
from the perspective of a specific component and its children. In that case, the
|
|
|
|
|
solution presented above will not work, since it sets the global environment.
|
|
|
|
|
|
|
|
|
|
There is a hook for this situation: [`useSubEnv`](hooks.md#usesubenv).
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
class FormComponent extends Component {
|
|
|
|
|
constructor(parent, props) {
|
|
|
|
|
super(parent, props);
|
|
|
|
|
useSubEnv({ myKey: someValue });
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
2019-11-11 17:31:34 +01:00
|
|
|
## Content of an Environment
|
|
|
|
|
|
|
|
|
|
Some good use cases for additional keys in the environment are:
|
|
|
|
|
|
|
|
|
|
- some configuration keys,
|
|
|
|
|
- session information,
|
|
|
|
|
- generic services (such as doing rpcs, or accessing local storage).
|
|
|
|
|
|
|
|
|
|
Doing it this way means that components are easily testable: we can simply
|
|
|
|
|
create a test environment with mock services.
|
|
|
|
|
|
|
|
|
|
For example:
|
|
|
|
|
|
|
|
|
|
```js
|
|
|
|
|
async function myEnv() {
|
|
|
|
|
const templates = await loadTemplates();
|
|
|
|
|
const qweb = new QWeb({ templates });
|
|
|
|
|
const session = getSession();
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
_t: myTranslateFunction,
|
|
|
|
|
session: session,
|
|
|
|
|
qweb: qweb,
|
|
|
|
|
services: {
|
|
|
|
|
localStorage: localStorage,
|
|
|
|
|
rpc: rpc
|
|
|
|
|
},
|
|
|
|
|
debug: false,
|
|
|
|
|
inMobileMode: true
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function start() {
|
|
|
|
|
App.env = await myEnv();
|
|
|
|
|
const app = new App();
|
|
|
|
|
await app.mount(document.body);
|
|
|
|
|
}
|
|
|
|
|
```
|