nope/lib/observables/index.ts

147 lines
4.1 KiB
TypeScript
Raw Normal View History

2021-08-30 04:40:28 +00:00
/**
2022-01-19 17:38:43 +00:00
* @module observables
2021-08-30 04:40:28 +00:00
* @author Martin Karkowski
* @email m.karkowski@zema.de
2022-01-19 17:38:43 +00:00
*
* # Observables
*
* ## Usage of `nope.observables`
*
* Import Nope.
*
* ```typescript
* import * as nope from "nope";
* ```
*
* In our nodebook, we have to use **javascript** instead of **typescript**:
*
* ```javascript
* // First lets install nope using npm
* const nope = require("../dist-nodejs/index.nodejs");
*
* // Create our Observable:
* const obs = new nope.observables.NopeObservable();
* ```
* ### `setContent`: Change the content of the Observable.
*
* To change the content of an observable use the function `setContent`.
*
* ```javascript
* // Set the content to "1337"
* obs.setContent(5);
*
* // Print the content (see getContent)
* console.log("current value =", obs.getContent());
* ```
*
* > ` current value = 5`
*
* #### `setter`: Define a specific setter for the observable.
*
* You can specify a specifc getter for the observable for instance, to limit the number to the following constrains `> 0` and `< 10`.
*
*
* The setter function will receive multiple parameters, as listed below:
*
* 1. `value`,
* 2. `options` containing:
* - `sender`: The Element, which changed the data
* - `timestamp`: The timestamp of the change
* - `args`: additional args.
*
*
*
* The setter function have to return a `dict` with the following keys:
*
* | key | type | content |
* | - | - | - |
* | `valid` | `bool` | A Flag, to show whether the data are valid or not. If the data is invalid, the observable wont store them |
* | `value` | `any` | The Data that has been adapted |
*
*
*
* Below, we will implement an example to show the setter above.
*
* ```javascript
* obs.setter = (value, options) => {
* // Print, which data we received
* console.log("setter received", value, options);
* // Show the result of our comparison
* console.log("data is valid:", value > 0 && value < 10);
* return {
* // The Value
* value: value,
* // Valid
* valid: value > 0 && value < 10,
* };
* };
*
* // Set the content to "1337" ==> But our setter will prevent using this value because it isnt valid.
* obs.setContent(1337);
*
* // Print the content (see getContent) ==> we expect to get "5"
* console.log("current value =", obs.getContent());
* ```
*
* > ```
* > setter received 1337 {}
* > data is valid: false
* > current value = 5
* > ```
*
* To remove such a getter just set the getter property to `null`.
*
* ```javascript
* obs.setter = null;
*
* // Set the content to "1337" we do not have any setter ==> we will use this parameter
* obs.setContent(1337);
*
* // Print the content (see getContent) ==> we expect to get "1337"
* console.log("current value =", obs.getContent());
* ```
*
* > `current value = 1337`
*
* ### `getContent`: Get the current content of the Observable.
*
* To extract the content of our observable, we are able to use the function `getContent`
*
* ```javascript
* let content = obs.getContent();
* console.log("current value =", content);
* ```
*
* > `current value = 1337`
*
* If no data is assigned, this will result in `undefined`. Otherwise the current data is returned.
*
* #### `getter`: Define a specific getter for the observable.
*
* You can specify a specifc getter for the observable for instance, to allways return a `string`
*
* ```javascript
* // Define a getter
* obs.getter = (value) => "Allways this result";
* console.log("current value (with getter) =", obs.getContent());
* ```
*
* > `current value (with getter) = Allways this result`
*
* To remove such a getter just set the getter property to `null`.
*
* The Original value is not changed ==> we expect to get "1337"
*
* ```javascript
* // Reset the getter.
* obs.getter = null;
* console.log("current value (after removing the getter) =", obs.getContent());
* ```
*
* > `current value (after removing the getter) = 1337`
2021-08-30 04:40:28 +00:00
*/
export * from "../types/nope/nopeObservable.interface";
export { NopeObservable } from "./nopeObservable";
export { InjectableNopeObservable } from "./nopeObservable.injectable";