Accessor
Accessor是一个抽象类,它有助于访问实例属性以及监视属性更改的机制。Accessor的每个子类都定义可以直接访问的属性,或者使用get()和set()方法。可以使用watch()方法来监视属性的更改。
方法概述
get():获取属性的值。
set():设置属性的值。
watch():监视实例上的属性更改。
方法简介
- get(path):获取属性的值。属性的名称可以引用实例中的属性。
view.get("scale");
它还可以是到实例中更深入的属性的路径。如果路径中的属性不存在,get()返回undefined。
var title = map.get("basemap.title");
var title = map.basemap && map.basemap.title || undefined;
- set(path, value):设置属性的值。使用属性名和值调用set()来更改属性的值。
// 设置地图的基本地图
map.set("basemap", "topo-vector");
map.basemap = "topo-vector";
var updateViewScale = view.set.bind(view, "scale");
updateViewScale(5000);
可以通过属性和值的路径调用set()。如果路径中的属性不存在,则不设置该属性。
// 更新基本地图的标题
map.set("basemap.title", "World Topographic Map");
if (map.basemap != null) {
map.basemap.title = "World Topographic Map";
}
可以将具有键-值对的对象传递给set()来一次更新多个属性。
const map = new Map({
});
map.set("basemap","topo-vector");
map.set("basemap.title","World");
const view = new MapView({
container: 'mapDivRef',
map: map,
});
// 在视图上设置一个视图 --第一个方法
view.set({
center: [-4.4861, 48.3904],
scale: 5000
});
//第二个方法
var updateView = view.set.bind(view);
updateView({
center: [-4.4861, 48.3904],
scale: 5000
});
- watch(path, callback):监视实例上的属性更改。监视属性更改对于跟踪对象上的更改非常重要。要开始监视属性上的更改,可以使用属性名和一个回调函数调用watch(),该函数将在每次属性更改时执行。
var handle = mapview.watch("scale", function(newValue, oldValue, propertyName, target) {
console.log(propertyName + " changed from " + oldValue + " to " + newValue);
});
要停止监视更改,可以对watch()返回的对象调用remove()方法。
handle.remove();
存储来自watch()的结果对象以正确地清除引用是很重要的。
var viewHandles = [];
function setView(view) {
//删除当前视图的句柄。
viewHandles.forEach(function(handle) {
handle.remove();
});
viewHandles.length = 0;
this.view = view;
// 观察新设置的视图上的属性。
if (view) {
viewHandles.push(
view.watch("scale", scaleWatcher);
);
}
}
setView(mapView);
setView(null);
与get()和set()一样,可以通过传递路径来监视对象层次结构深处的属性。如果路径中的属性不存在,则以undefined调用监视回调。
var view = new SceneView({
map: new Map({
basemap: "streets-vector"
})
});
view.watch("map.basemap.title", function(newValue, oldValue) {
console.log("basemap's title changed from " + oldValue + " to " + newValue);
});
view.map.basemap = "topo-vector";
// 输出:“basemap的标题从街道改为地形”
view.map = null;
// 输出:“basemap的标题从地形改为未定义”
传递以逗号分隔的属性路径列表或属性路径数组,以观察具有相同回调的多个属性。使用回调调用的第三个参数来确定更改了什么属性。
view.watch("center, scale, rotation", function(newValue, oldValue, propertyName) {
console.log(propertyName + " changed");
});
view.watch(["center", "scale", "rotation"], function(newValue, oldValue, propertyName) {
console.log(propertyName + " changed");
});
var callback = function(newValue, oldValue, propertyName) {
console.log(propertyName + " changed");
}
view.watch("center", callback);
view.watch("scale", callback);
view.watch("rotation", callback);
访问器不会在属性的值更改后立即调用该属性的监视回调。相反,当属性的值发生变化并且该属性被监视时,访问器会安排一个通知,然后在稍后处理该通知。频繁变化的属性,比如视图。可以在不限制回调的情况下观察缩放。
view.watch("scale", function(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);
类型定义
watchCallback:当被监视的属性更改时调用的回调函数。
参数
- newValue:被监视属性的新值。
- oldValue:被监视属性的旧价值。
- propertyName :属性名。
- target :包含被监视属性的对象。
WatchHandle:表示在对象调用watch()时创建的监视。
属性
- remove :移除监听
var handle = map.watch('basemap', function(newVal){
// 每一次地图的价值。basemap发生变化时,它会被记录在控制台中
console.log("new basemap: ", newVal);
});
// 调用remove()时,地图不再监视basemap的变化
handle.remove();
版权声明:
作者:Gomo
链接:https://www.develophm.com/index.php/accessor/757/
来源:开发之家
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论