箭头函数改变定时器中的this指向

此时viewer下的方法可以正常调用

mounted() {
    var viewer = new Cesium.Viewer('cesiumContainer');
    var czml1 = [{
            "id" : "document",
            "name" : "CZML Point - Time Dynamic",
            "version" : "1.0",
            "clock": {
                "interval": "2012-08-04T16:00:00Z/2012-08-04T18:00:00Z",
                "currentTime": "2012-08-04T16:00:00Z",
                "multiplier": 10
            },
        }, {
            "id" : "point",
            "availability" :"2012-08-04T16:00:00Z/2012-08-04T16:05:00Z",
            "position" : {
                "epoch" : "2012-08-04T16:00:00Z",
                "cartographicDegrees" : [
                    0.0, 118.87841653400005, 30.95679870500004, 0.0,
                    10.0, 118.87826541800007, 30.95680770900003, 0.0,
                    20.0, 118.8774481050001, 30.956860625000047, 0.0,
                    30.0, 118.87660414600009, 30.956910105000077, 0.0,
                    40.0, 118.8759846580001, 30.95694296000005, 0.0,
                    50.0, 118.87542502500003, 30.956978761000073, 0.0,
                    60.0, 118.87473380100005, 30.957024103000037, 0.0
                ]
            },
            "point" : {
                "color" : {
                    "rgba" : [255, 255, 255, 128]
                },
                "outlineColor" : {
                    "rgba" : [255, 0, 0, 128]
                },
                "outlineWidth" : 3,
                "pixelSize" : 15
            }
    }];
    var dataSourcePromise;
    var i = 30.957024;
    var j = 30.956798;
    var a = 60;
    setInterval(function() { 
        i += 0.0001;
        j -= 0.0001;
        a += 10;
        czml1[1].position.cartographicDegrees.push(a, 118.8747338, i, 0); //路径最后添加节点 
        czml1[0].clock.currentTime = viewer.clock.currentTime.toString(); //获取当前时间 修改当前时间
        viewer.entities.removeAll(); //清空之前数据 避免数据堆积
        viewer.dataSources.add(Cesium.CzmlDataSource.load(czml1)); //重新添加修改后的数据
    }, 1000);
    dataSourcePromise = Cesium.CzmlDataSource.load(czml1);
    viewer.dataSources.add(dataSourcePromise);
    viewer.zoomTo(dataSourcePromise);
},

在data中定义viewer后 setInterval中报错 this.viewer is undefined 这是因为定时器中的this指向了Window 但应该指向vue的实例

data() {
    return {
        viewer:"",
        color:  'rgba(03,194,58, 128)',
        color1: [103,194,58, 128],
    }
}, 
setInterval(function() { 
    i += 0.0001;
    j -= 0.0001;
    a += 10;
    czml1[1].position.cartographicDegrees.push(a, 118.8747338, i, 0); //路径最后添加节点 
    czml1[0].clock.currentTime = this.viewer.clock.currentTime.toString(); //获取当前时间 修改当前时间
    this.viewer.entities.removeAll(); //清空之前数据 避免数据堆积
    this.viewer.dataSources.add(Cesium.CzmlDataSource.load(czml1)); //重新添加修改后的数据
}, 1000);

 vue中使用定时器时this指向

使用setInterval时this指向的问题。如果我们直接this.timer = setInterval(function(){要触发的函数}) 是会报错的。因为这样的话this的指向为window,但是我们要触发的函数是挂载在vm实例上面的。所以这个时候就是箭头函数发挥用处的时候了。我们可以直接这样写this.timer = setInterval(() => {要触发的函数}).

setInterval(() => {
    i += 0.0001;
    j -= 0.0001;
    a += 10;
    czml1[1].position.cartographicDegrees.push(a, 118.8747338, i, 0); //路径最后添加节点 
    czml1[0].clock.currentTime = this.viewer.clock.currentTime.toString(); //获取当前时间 修改当前时间
    this.viewer.entities.removeAll(); //清空之前数据 避免数据堆积
    this.viewer.dataSources.add(Cesium.CzmlDataSource.load(czml1)); //重新添加修改后的数据
}, 1000);

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值