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/
来源:开发之家
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>