Module ###### For the reference see: :doc:`/reference/module` A *Module* is the main control unit for several components, which for example will all access a shared service defined in the module. A *Module* can host *Submodules* which will be either specified through ``Modules`` or inside the *routes* directive with ``load_children``. The module is responsible for instantiating the one-and-only ``router`` instance, which controls the navigation between components. Properties of a *Module* ======================== - Attributes and other defininitions, like *services* in the *Module* can be accessed by: - Submodules (and components of it) - Components (and subcomponents of it) created by the module or during routing - It can declare: - *bindings*: which auto-generates an attribute bound to an *Observable* - *services*: which will be added as attributes and instantiated to provide a service to components and submodules - *modules*: which will be instantiated as submodules. Submodules don't, for example, host a ``router`` instance - *components*: which will be bootstrapped during initialization (before the routing engine takes over, if routes are defined) - *routes*: which define the navigation hierarchy - *selector* (default: ``None``) The default behavior of a module controlling an application is that things are plotted in the body of the html document. Where exactly is decided by the rendering engine (i.e.: the browser in most cases). If finer control is wished, one can - Insert a ```` tag in the html document and the module will use the tag as the root node for components to be rendered to. - Specify a different name in the module definition with for example ``selector = 'my-module-tag'`` and later have this as a tag in the html document as in: ````. Everything will be rendered under this tag. An Empty Module =============== With no definitions it would simply look like this after having inherited from ``Module`` and if we looked into the contents of each of the directives. .. code-block:: python from anpylar import Module class MyModule(Module): bindings = {} services = {} modules = [] components = [] # can be a single item or an iterable routes = [] A more standard look for a real application could look like this. .. code-block:: python from anpylar import Module from .app_component import AppComponet from .one_component import OneComponent from .two_component import TwoComponent from .the_service import TheService class MyModule(Module): bindings = {} services = {'the_service': TheService} modules = [] components = AppComponent # can be a single item or an iterable routes = [ {'path': 'one', 'component': OneComponent,}, {'path': 'two', 'component': TwoComponent,}, ] This defines a *Module* that: - Creates a service from ``TheService`` and makes it reachable as an attribute under the name ``the_service`` - Bootstraps the component ``AppComponent`` before the routing engine takes over - Instantiates the routing engine with two routes: ``http://baseurl/one`` and ``http://baseurl/two`` for which components ``OneComponent`` and ``TwoComponent`` will be respectively instantiated