app.js里怎么设置globalData的值,就像page里setData一样
我看过这个示例代码,他是通过回调传参的方式把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) }, |
嗯,这个嘛,既然这样问,或许就一言难尽了。首先,要充分理解小程序的框架:注册两个不同层次的对象,一个是程序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素养的,估计看这段代码会有点困惑的,值得好好琢磨。