2016-11-06 80 views
2

不火在下面的代碼:

export default { 
    props: ['note'], 
    methods: { 
     remove(){ 
      NoteRepo.remove(this.note, (err) => { 
       if (err) { 
        console.log('Should Fire') 
        this.$emit('alerted', { 
         type: 'error', 
         message: 'Failed to remove note' 
        }); 
       } 
      }) 
     } 
    } 
} 

當remove函數被調用時,控制檯登錄「應該火」,但$發出事件不會被解僱。如果我將$ emit放在回調之外,如下所示:

export default { 
    props: ['note'], 
    methods: { 
     remove(){ 
      this.$emit('alerted', { 
       type: 'error', 
       message: 'Failed to remove note' 
      }); 

      NoteRepo.remove(this.note, (err) => { 
       if (err) { 
        console.log('Should Fire') 
       } 
      }) 
     } 
    } 
} 

它可以工作。我試過分配_this = this並使用它來觸發$ emit但沒有區別。

爲什麼$ emit事件不會在回調中觸發?

+0

你有沒有試過不使用箭頭功能?我剛開始使用vue,但我似乎記得在文檔中閱讀時,箭頭函數在某些地方使用時不能正確地綁定上下文。 – theWanderer4865

+0

是的,如果我理解正確,當使用箭頭函數'this'代表Vue實例時,所以在這種情況下,箭頭函數沒問題。這就是說,我已經嘗試過了(並且在這個過程中也分配了'_self = this'),並沒有什麼區別。我嘗試了各種方法來混淆它,但沒有運氣。 – evu

+1

我在這裏找到了相關的位:http://vuejs.org/v2/guide/instance.html#Properties-and-Methods看起來像箭頭函數沒有綁定到虛擬機實例。 – theWanderer4865

回答

0

所以事實證明這是在NoteRepo造成的問題。具體來說,Firebase事件回調。

constructor() { 
     super(); 

     // Initialize Firebase 
     Firebase.initializeApp({ 
      apiKey: "xxx", 
      authDomain: "xxx", 
      databaseURL: "xxx", 
      storageBucket: "xxx", 
      messagingSenderId: "xxx" 
     }); 

     this.ref = Firebase.database().ref('notes'); 
     this.attachFirebaseListeners(); 
    } 

    attachFirebaseListeners() { 
     this.ref.on('child_added', this.onAdded, this); 
     this.ref.on('child_removed', this.onRemoved); // Removing 'this' here seems to of fixed it. 
     this.ref.on('child_changed', this.onChanged, this); 
    } 

我不確定究竟是什麼錯誤,但這似乎是現在排序它。