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 )
2020-04-17 12:12:02 +02:00
- [Special keys ](#special-keys )
2019-11-11 17:31:34 +01:00
## 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
2020-10-27 14:41:09 +01:00
const env = {
2019-10-31 22:45:22 +01:00
_t : myTranslateFunction ,
user : { ... } ,
services : {
...
} ,
} ;
2020-10-27 14:41:09 +01:00
mount ( App , { target : document . body , env } ) ;
2019-10-31 22:45:22 +01:00
```
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,
2020-04-17 12:12:02 +02:00
- generic services (such as doing rpcs).
2019-11-11 17:31:34 +01:00
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 ,
2020-04-21 15:08:53 +02:00
rpc : rpc ,
2019-11-11 17:31:34 +01:00
} ,
debug : false ,
2020-04-21 15:08:53 +02:00
inMobileMode : true ,
2019-11-11 17:31:34 +01:00
} ;
}
async function start ( ) {
2020-10-27 14:41:09 +01:00
const env = await myEnv ( ) ;
mount ( App , { target : document . body , env } ) ;
2019-11-11 17:31:34 +01:00
}
```
2020-04-17 12:12:02 +02:00
## Special Keys
There are two special key/value added by Owl if not provided in the environment:
the `QWeb` instance and a `browser` object:
- `qweb` will be set to an empty `QWeb` instance. This is absolutely necessary
for Owl to be able to render anything
- `browser` : this is an object that contains some common access points to the
2020-11-20 10:33:03 +01:00
browser methods with a side effect. See [browser ](browser.md ) for more information. Note that the browser object will be removed from the environment in Owl 2.0.