2017-02-16 8 views
1

Мой код компонента, как это:Как решить Uncaught TypeError: this.filters не является функцией? (Vue.js 2)

<script> 
    import _ from 'lodash' 
    export default{ 
     props:['search','category'], 
     data(){ 
      return{ 
       price_min:'', 
       price_max:'' 
      } 
     }, 
     computed:{ 
      filters(data){ 
       const price = {min:this.price_min, max:this.price_max} 
       return {q:this.search, category:this.category, sort:data, location:data, price} 
      }, 
     }, 
     methods:{ 
      filterProduct: _.debounce(function(data=null){ 
        this.$store.dispatch('getProducts', this.filters(data)) 
      },500) 
     } 
    } 
</script> 

Мой полный код выглядит так: http://pastebin.com/K7vwU0yY

При выполнении на консоли существует ошибка, как это:

Uncaught TypeError: this.filters is not a function

Как я могу решить эту ошибку?

+0

Я думаю, вы должны объявить следующим образом: 'filters: function (data) {...}'. –

+0

вычисляет создает свойство данных, оно не предназначено для использования в качестве функции. Больше похоже на свойство данных, которое вычисляется по некоторым другим переменным. –

+0

'местоположение: данные, цена', что означает эта линия? Так что я могу предложить вам альтернативу. –

ответ

2
computed:{ 
     filters(data) { // the first argument is supposed to be the `this` 
      const price = {min:this.price_min, max:this.price_max} 
      return {q:this.search, category:this.category, sort:data, location:data, price} 
     }, 
    }, 
    methods:{ 
     filterProduct (data = null) { 
      return _.debounce(function (data=null) => { 
      this.$store.dispatch('getProducts', this.filters(data)) 
      },500).call(this, data) 
     } 
    } 

Вы потеряли контекст экземпляра компонента vue с помощью анонимной функции. Используйте функцию стрелки или сохранить контекст в let self = this

В вашем случае, вы возвращаете функцию с помощью _.debounce(fn() {}, ms), но делает это так, вы потеряли контекст this.

Итак, я переместил ваш код дебюта внутри метода, который возвращает функцию обратного вызова функции debounce с this, установленную в экземпляре vue component.

Кроме того, computed свойства не должны использоваться в качестве функции. Таким образом, this.filters(data) будет по-прежнему давать аналогичную ошибку, так как это свойство, как и те, которые вы можете создать в data экземпляра компонента vue. Вместо этого используйте метод.

+0

Это новая ошибка. Ошибка: 'Uncaught TypeError: Невозможно прочитать свойство 'dispatch' of undefined' –

+0

Если вы' console.log (this) 'перед ошибкой, я думаю, вы увидите экземпляр lodash. Вам нужно сохранить переменную как 'let self = this' и использовать self во всем коде. –

+0

Проверьте 'bind (this)' edit, это поможет? –