@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
313 lines (310 loc) • 11.8 kB
TypeScript
import type { ResourceHandle } from "./Handles.js";
export type GroupKey<T> = Exclude<T, ResourceHandle>;
/**
* Accessor is an abstract class that facilitates the access to instance properties as well as a mechanism to watch for property changes.
* It is possible to watch for a property changes by using the [watch()](https://developers.arcgis.com/javascript/latest/references/core/core/Accessor/#watch) method.
*
* @since 4.0
* @see [Guide - Implementing Accessor](https://developers.arcgis.com/javascript/latest/implementing-accessor/)
* @see [Guide - Watching for component changes](https://developers.arcgis.com/javascript/latest/watch-for-changes/#watch-for-changes-in-web-components)
* @see [Guide - Watching for changes](https://developers.arcgis.com/javascript/latest/watch-for-changes/#watch-for-changes-in-the-api)
* @see [Get started - TypeScript](https://developers.arcgis.com/javascript/latest/get-started/#typescript)
*/
export default class Accessor {
/**
* Creates a subclass of the class calling this method.
*
* @param classDefinition - An object with properties and methods to mix in to the newly created class.
* @returns Returns a constructor of the newly created class.
* @since 4.21
* @see [Guide - Implementing Accessor](https://developers.arcgis.com/javascript/latest/implementing-accessor/)
*/
static createSubclass(classDefinition?: any): typeof Accessor;
constructor(...args: any[]);
/**
* The name of the class. The declared class name is formatted as `esri.folder.className`.
*
* @since 4.7
*/
readonly declaredClass: string;
get destroyed(): boolean;
/** Set to `true` once the initialize function has executed. */
get initialized(): boolean;
/**
* Gets the value stored for a property. It can be used when creating a class extending Accessor to get the value stored internally without calling the property getter. For example, this may be used to return a default value for a property when the property is accessed before a value is set on it.
*
* @param propertyName - The name of the property to get.
* @returns The property's value.
* @example
* ```js
* get propertyWithDefault() {
* return this._get("propertyWithDefault") ?? defaultValue;
* }
* ```
*/
protected _get<T>(propertyName: string): T;
/**
* Sets the stored value of a property. Calling `_set` directly updates the stored value and skip checks like defined in the `@property()` decoration like `readOnly` or `type`. This is typically used to update the stored value in a property setter, or to update a read only property.
*
* @param propertyName - The name of the property to set.
* @param value - The new value to set on the property.
* @example
* ```js
* \@subclass("Counter")
* class Counter {
* \@property({ readOnly: true })
* value = 0;
*
* increment() {
* this._set("value", this.value + 1);
* }
* }
* ```
*/
protected _set(propertyName: any, value: any): this;
/**
* Adds one or more handles which are to be tied to the lifecycle of the object. The handles will
* be removed when the object is destroyed.
*
* ```js
* // Manually manage handles
* const handle = reactiveUtils.when(
* () => !view.updating,
* () => {
* wkidSelect.disabled = false;
* },
* { once: true }
* );
*
* this.addHandles(handle);
*
* // Destroy the object
* this.destroy();
* ```
*
* @param handleOrHandles - Handles marked for removal once the object is destroyed.
* @param groupKey - Key identifying the group to which the handles should be added. All the handles in the group
* can later be removed with [removeHandles()](https://developers.arcgis.com/javascript/latest/references/core/core/Accessor/#removeHandles).
* If no key is provided the handles are added to a default group.
* @since 4.25
*/
addHandles<T>(handleOrHandles: ResourceHandle | ResourceHandle[], groupKey?: GroupKey<T>): void;
destroy(): void;
/**
* Returns true if a named group of handles exist.
*
* @param groupKey - A group key.
* @returns Returns `true` if a named group of handles exist.
* @since 4.25
* @example
* // Remove a named group of handles if they exist.
* if (obj.hasHandles("watch-view-updates")) {
* obj.removeHandles("watch-view-updates");
* }
*/
hasHandles<T>(groupKey?: GroupKey<T>): boolean;
/**
* Marks a property has changed. The next time the property is accessed,
* the getter for that property will be invoked.
* If the property is watched, the watcher callbacks will be called
* if the new value of the property has effectively changed.
*
* @param propertyName - The name of the property that may have changed.
*/
protected notifyChange(propertyName: string): void;
/**
* Removes a group of handles owned by the object.
*
* @param groupKey - A group key or an array or collection of group keys to remove.
* @since 4.25
* @example
* obj.removeHandles(); // removes handles from default group
*
* obj.removeHandles("handle-group");
* obj.removeHandles("other-handle-group");
*/
removeHandles<T>(groupKey?: GroupKey<T>): void;
/**
* Sets the value of a property.
*
* Call `set()` with a property name and a value to change the value of the property.
*
* ```js
* // setting the basemap of the map
* map.set("basemap", "topo-vector");
* // is equivalent to
* map.basemap = "topo-vector";
*
* // currying set
* let updateViewScale = view.set.bind(view, "scale");
* updateViewScale(5000);
* ```
*
* `set()` can be called with the path to a property and a value.
* The property is not set if a property in the path doesn't exist.
*
* ```js
* // updating the title of the basemap
* map.set("basemap.title", "World Topographic Map");
*
* // is equivalent to
* if (map.basemap != null) {
* map.basemap.title = "World Topographic Map";
* }
* ```
*
* @param path - The path to the property to set
* @param value - The new value to set on the property.
* @returns The instance.
*/
set<T>(path: string, value: T): this;
/**
* An object with key-value pairs may be passed into `set()` to update multiple properties at once.
*
* ```js
* // setting a viewpoint on the view
* view.set({
* center: [-4.4861, 48.3904],
* scale: 5000
* });
*
* // currying set
* let updateView = view.set.bind(view);
*
* updateView({
* center: [-4.4861, 48.3904],
* scale: 5000
* });
* ```
*
* @param props - an object of key-value pairs
* @returns The instance.
*/
set(props: Record<string, any>): this;
/**
* Watches for property changes on the instance. For additional capabilities when observing changes on properties, see [reactiveUtils](https://developers.arcgis.com/javascript/latest/references/core/core/reactiveUtils/).
*
*
* Watching for property changes is essential for tracking changes on objects.
* To start watching for changes on a property, call `watch()` with the property
* name and a callback function that will execute each time the property changes.
*
* ```js
* let handle = mapview.watch("scale", function(newValue, oldValue, propertyName, target) {
* console.log(propertyName + " changed from " + oldValue + " to " + newValue);
* });
* ```
*
* To stop watching for changes, call the `remove()` method on the object that `watch()` returns.
*
* ```js
* handle.remove();
* ```
*
* It is important to store the resulting objects from `watch()` to properly clean up the references.
*
* ```js
* let viewHandles = [];
* function setView(view) {
* // remove the handles for the current view.
* viewHandles.forEach(function(handle) {
* handle.remove();
* });
* viewHandles.length = 0;
*
* this.view = view;
*
* // watch for properties on the newly set view.
* if (view) {
* viewHandles.push(
* view.watch("scale", scaleWatcher);
* );
* }
* }
*
* setView(mapView);
* setView(null);
* ```
*
* Like `get()` and `set()`, it is possible to watch for a property deep in the object hierarchy by passing a path.
* If a property in the path doesn't exist the watch callback is called with `undefined`.
*
* ```js
* let view = new SceneView({
* map: new Map({
* basemap: "streets-vector"
* })
* });
*
* view.watch("map.basemap.title", (newValue, oldValue) => {
* console.log("basemap's title changed from " + oldValue + " to " + newValue);
* });
*
* view.map.basemap = "topo-vector";
* // output: "basemap's title changed from Streets to Topographic"
*
* view.map = null;
* // output: "basemap's title changed from Topographic to undefined"
* ```
*
* Pass a comma delimited list of property paths, or an array of property paths, to watch multiple properties with the same callback.
* Use the third parameter of the callback call to determine what property changed.
*
* ```js
* view.watch("center, scale, rotation", (newValue, oldValue, propertyName) => {
* console.log(propertyName + " changed");
* });
*
* // equivalent of
* view.watch(["center", "scale", "rotation"], (newValue, oldValue, propertyName) => {
* console.log(propertyName + " changed");
* });
*
* // equivalent of
* let callback = (newValue, oldValue, propertyName) => {
* console.log(propertyName + " changed");
* }
* view.watch("center", callback);
* view.watch("scale", callback);
* view.watch("rotation", callback);
* ```
*
* `Accessor` doesn't call the watch callbacks for a property immediately after its value changes.
* Instead, when a property's value changes and if that property is watched, `Accessor` schedules a
* notification which is then processed at a later time.
* Properties that change frequently like `view.scale` can be watched without having to throttle the callback.
*
* ```js
* // Divides the view.scale three times
* view.watch("scale", (newValue, oldValue) => {
* console.log("view's scale changed from " + oldValue + " to " + newValue);
* });
* console.log("current view scale: " + view.scale);
* view.scale = view.scale / 2;
* view.scale = view.scale / 2;
* view.scale = view.scale / 2;
* console.log("current view scale: " + view.scale);
*
* // output the following:
* // current view scale: 36978595.474472
* // current view scale: 4622324.434309
* // view's scale changed from 36978595.474472 to 4622324.434309
* ```
*
* @deprecated since version 4.32. Use [watch()](https://developers.arcgis.com/javascript/latest/references/core/core/reactiveUtils/#watch) instead.
* @param path - The property or properties to watch. Multiple properties can be specified as a comma-separated list.
* @param callback - The callback to execute when the property value has changed.
* @returns A watch handle
*/
watch(path: any, callback: WatchCallback): ResourceHandle;
}
/**
* Callback to be called when a watched property changes.
*
* @param newValue - The new value of the watched property.
* @param oldValue - The old value of the watched property.
* @param propertyName - The property name.
* @param target - The object containing the property being watched.
* @deprecated since version 4.32. Use [watch()](https://developers.arcgis.com/javascript/latest/references/core/core/reactiveUtils/#watch) instead.
*/
export type WatchCallback = (newValue: any, oldValue: any, propertyName: string, target: Accessor) => void;