收藏
回答

this.setData()在给data里面的元素赋值时不起作用,请问怎么改?


程序在加载时候,从云数据库读取用户信息,然后使用this.setData()给view里面的东西赋值。但是赋值之后不起作用,而且this.setData()后面的console也不执行了。

// miniprogram/pages/index/index.html.js
let app = getApp();
const db = wx.cloud.database();
Page({
 
  /**
   * 页面的初始数据
   */
  data: {
    name:'',
    grade: ''
  },
 
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    this.onGetOpenid();
  },
 
  onGetOpenid() {
    // 调用云函数
    wx.cloud.callFunction({
      name: 'login',
      data: {},
      success: res => {
        this.onInit(res.result.openid);
      },
      fail: err => {
        console.error('[云函数] [login] 调用失败', err)
      }
    });
  },
  onInit(openid) {
    // console.log(openid);
    // console.log(typeof (openid));
    //初始化用户信息
    db.collection('user')
      .where({
        _openId: openid //填入用户当前openId
      }).get({
        success: function (res) {
          // console.log(res.data);
          if (res.data.length > 0) {
            console.log("用户已存在");
            console.log("res: ", res);
            //获取用户的stuId
            app.globalData.stuId = res.data[0].stuId;
            app.globalData.score = res.data[0].score;
            app.globalData.name = res.data[0].name;
            this.setData({
              name:app.globalData.name,
              grade:app.globalData.score
            });
            console.log("app.globalData.stuId", app.globalData.stuId);
            console.log("app.globalData.score", app.globalData.score);
            console.log("app.globalData.name", app.globalData.name);
          } else {
            console.log('用户不存在,请先注册')
            wx.redirectTo({
              url: '../register/register',
            });
          }
        },
        err: function (e) {
          console.error('初始话用户信息失败', err)
        }
      })
  }
 
})

代码定位:54行-58行



请问代码有什么问题吗,应该怎么解决。

非常感谢各位!!!!

最后一次编辑于  2019-10-14
回答关注问题邀请回答
收藏

5 个回答

  • 风舞红枫、づ
    风舞红枫、づ
    2019-10-14
    onInit(openid) {
        var that = this;
        db.collection('user')
          .where({
            _openId: openid //填入用户当前openId
          }).get({
            success: function (res) {
              if (res.data.length > 0) {
                that.setData({
                  name:app.globalData.name,
                  grade:app.globalData.score
                });
              } else {
                console.log('用户不存在,请先注册')
                wx.redirectTo({
                  url: '../register/register',
                });
              }
            }
          })
      }

    类似这样,异步需要存this

    2019-10-14
    有用 5
    回复 1
    • tailor
      tailor
      2019-10-14
      哇!!可以了!非常感谢😁
      2019-10-14
      回复
  • 鲤子
    鲤子
    2019-10-14

    this作用域有问题,使用箭头函数即可

    2019-10-14
    有用 1
    回复 1
    • tailor
      tailor
      2019-10-14
      非常感谢,可以啦
      2019-10-14
      回复
  • 拾忆
    拾忆
    2019-10-14

    this.setData 的指向不对, var _this =this

    2019-10-14
    有用 1
    回复 1
    • tailor
      tailor
      2019-10-14
      非常感谢,可以啦😁
      2019-10-14
      回复
  • 刁_Kyle
    刁_Kyle
    2019-10-14

    报什么错

    2019-10-14
    有用
    回复 1
    • tailor
      tailor
      2019-10-14
      没有报错!不过已经解决,感谢
      2019-10-14
      回复
  • 叶無魂
    叶無魂
    2019-10-14

    你这个不报错吗

    2019-10-14
    有用
    回复 4
    • 叶無魂
      叶無魂
      2019-10-14
      onInit(openid) {
         let that = this
          db.collection('user')


      that.setData      云开发不用这样的吗  不然不会报错吗
      2019-10-14
      1
      回复
    • tailor
      tailor
      2019-10-14回复叶無魂
      没有报错哎,我试试,谢谢你
      2019-10-14
      回复
    • 叶無魂
      叶無魂
      2019-10-14回复tailor
      this指向问题 setData不会生效的
      2019-10-14
      1
      回复
    • tailor
      tailor
      2019-10-14回复叶無魂
      恩,可以了!!!谢谢你
      2019-10-14
      回复
登录 后发表内容
问题标签