mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
[IMP] component: add props on root components
This is a partial revert of commit 7d249d6f09.
The reason is that this changes made it much harder to unit test
components. Before, we could simply instantiate a component
like this:
const my|Comp = new MyComponent(null, props);
and then simply test it. This commit reestablish that possibility.
This commit is contained in:
@@ -443,10 +443,14 @@ const app = new App();
|
||||
app.mount(document.body);
|
||||
```
|
||||
|
||||
The root component does not have a parent nor props. It will be setup with an
|
||||
The root component does not have a parent nor `props` (see note below). It will be setup with an
|
||||
[environment](environment.md) (either the `env` defined on its class, or a
|
||||
default empty environment).
|
||||
|
||||
Note: a root component can however be given a `props` object in its constructor,
|
||||
like this: `new App(null, {some: 'object'});`. It will not be a true `props`
|
||||
object, managed by Owl (so, for example, it will never be updated).
|
||||
|
||||
### Composition
|
||||
|
||||
The example above shows a QWeb template with a sub component. In a template,
|
||||
|
||||
+11
-11
@@ -111,21 +111,22 @@ export class Component<T extends Env, Props extends {}> {
|
||||
* hand. Other components should be created automatically by the framework (with
|
||||
* the t-component directive in a template)
|
||||
*/
|
||||
constructor(parent?: Component<T, any>, props?: Props) {
|
||||
constructor(parent?: Component<T, any> | null, props?: Props) {
|
||||
Component.current = this;
|
||||
|
||||
const id: number = nextId++;
|
||||
let constr = this.constructor as any;
|
||||
const defaultProps = constr.defaultProps;
|
||||
if (defaultProps) {
|
||||
props = this.__applyDefaultProps(props, defaultProps);
|
||||
}
|
||||
this.props = <Props>props;
|
||||
if (QWeb.dev) {
|
||||
QWeb.utils.validateProps(constr, this.props);
|
||||
}
|
||||
|
||||
const id: number = nextId++;
|
||||
let depth;
|
||||
if (parent) {
|
||||
const defaultProps = constr.defaultProps;
|
||||
if (defaultProps) {
|
||||
props = this.__applyDefaultProps(props, defaultProps);
|
||||
}
|
||||
this.props = <Props>props;
|
||||
if (QWeb.dev) {
|
||||
QWeb.utils.validateProps(constr, this.props);
|
||||
}
|
||||
this.env = parent.env;
|
||||
const __powl__ = parent.__owl__;
|
||||
__powl__.children[id] = this;
|
||||
@@ -136,7 +137,6 @@ export class Component<T extends Env, Props extends {}> {
|
||||
if (!this.env.qweb) {
|
||||
this.env.qweb = new QWeb();
|
||||
}
|
||||
this.props = (undefined as unknown) as Props;
|
||||
this.env.qweb.on("update", this, () => {
|
||||
if (this.__owl__.isMounted) {
|
||||
this.render(true);
|
||||
|
||||
@@ -71,9 +71,9 @@ class WidgetA extends Widget {
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
describe("basic widget properties", () => {
|
||||
test("props is not defined on root components", async () => {
|
||||
const widget = new Widget();
|
||||
expect(widget.props).toBe(undefined);
|
||||
test("props is set on root components", async () => {
|
||||
const widget = new Widget(null, {});
|
||||
expect(widget.props).toEqual({});
|
||||
});
|
||||
|
||||
test("has no el after creation", async () => {
|
||||
|
||||
Reference in New Issue
Block a user