如何在承诺回拨中更新Vue应用程序或组件的属性?

时间:2017-03-04 00:17:11

标签: vue.js vuejs2

我需要更新Firebase回调中的Vue属性,如下所示,但它不起作用。这段代码

methods: {
    sign_out : function(e) {
        this.item_count = 0
    }
}

有效,但是当在promise回调中设置属性时:

methods: {
  sign_out : function(e) {
  firebase.auth().signOut().then(function() {
      this.item_count = 0
    })
  },

在这种情况下如何设置属性的值?

2 个答案:

答案 0 :(得分:22)

你的回调中的this指向错误的对象。有几种方法可以解决这个问题。

  1. 在闭包中捕获this

    methods: {
      sign_out : function(e) {
        var self = this;
        self.item_count = 0
        firebase.auth().signOut().then(function() {
          self.item_count = 0
      })
    }
    
  2. 使用胖箭头。

    methods: {
      sign_out : function(e) {
        this.item_count = 0
        firebase.auth().signOut().then(() => this.item_count = 0)
      }
    }
    
  3. 使用bind()。

    methods: {
      sign_out : function(e) {
        this.item_count = 0
        firebase.auth().signOut().then(function() {
          this.item_count = 0
        }.bind(this))
    }
    
  4. 胖箭头在所有现代浏览器中都不起作用,因此只有在编译为es5时才使用它们。

答案 1 :(得分:1)

一种方法是在回调之外引用它。使用回调内部的引用来访问目标对象上的引用。

所以尝试类似:

methods: {
  sign_out : function(e) {
  this.item_count = 0
  _this = this;
  firebase.auth().signOut().then(function() {
       _this.item_count = 0        
    })
 },