app.js里怎么设置globalData的值,就像page里setData一样
发布于 5 年前 作者 ryi 13711 次浏览 来自 问答

app.js里怎么设置globalData的值,就像page里setData一样

6 回复

谢谢大家的回复和热心

我看过这个示例代码,他是通过回调传参的方式把that.globalData.userInfo的值传到其它page页,但是这里也有一个问题就是你在wx.login这个函数外console.log(that.globalData.userInfo)永远都是null,不知道是不是异步的原因还是 that.globalData.userInfo = res.userInfo没有改变globalData 的值

app.js

App({
  globalData:{
    userInfo:null,
    text:'111'
  }
})

abc.js

onLoad:function(e){
    var that=this
    console.log(app.globalData.text)
    app.globalData.text = '222'
    console.log(app.globalData.text)
  },

globalData 这个变量看来是我可以随便定呀。

嗯,这个嘛,既然这样问,或许就一言难尽了。首先,要充分理解小程序的框架:注册两个不同层次的对象,一个是程序app,一个是页面page,一个小程序就只有一个app,而page可以有多个,就是说一个app,加上若干个page,就构成了小程序。其次是要理解数据绑定机制,即逻辑层与视图层的数据设置、传递和刷新的机制。官方示例小程序中的globalData,是app里面的,对于小程序而言,就相当于全局对象了,所以,要设置globalData的值,在app,js里面,可直接设置,即示例里面的this.globalData.userinfo了,如:this.globalData.userinfo='xxxx’之类,而在page里面呢,首先要通过getApp()来获得app对象,如示例代码里面的var app = getApp(),然后就可以用app.globalData来访问全局对象里面的某个数据了,如app.globalData.userinfo。再来看setData()这个函数,它是Page对象的函数(方法),而非app对象的函数,只能用来设置(绑定)页面数据。进一步来看,页面中的data数据,其实也是可以直接以this.data.xxx来访问的,但这样却不能绑定到视图层里面去,官方文档的原话就是:“setData 函数用于将数据从逻辑层发送到视图层,同时改变对应的 this.data 的值。”

题外话:官方示例程序里面,有一段代码,堪称华彩乐段:

getUserInfo:function(cb){
    var that = this
    if(this.globalData.userInfo){
      typeof cb == “function” && cb(this.globalData.userInfo)
    }else{
      //调用登录接口
      wx.login({
        success: function () {
          wx.getUserInfo({
            success: function (res) {
              that.globalData.userInfo = res.userInfo
              typeof cb == “function” && cb(that.globalData.userInfo)
            }
          })
        }
      })
    }
  }

这其实是一个自定义函数,没有一定javascript素养的,估计看这段代码会有点困惑的,值得好好琢磨。

回到顶部