В Vue JS вызовите фильтр из метода внутри экземпляра vue

86

Скажем, у меня есть такой экземпляр Vue:

new Vue({
    el: '#app',

    data: {
        word: 'foo',
    },

    filters: {
       capitalize: function(text) {
           return text.replace(/(?:^|\s)\S/g, function(a) { return a.toUpperCase(); });
       }
    },

    methods: {
        sendData: function() {
            var payload = this.$filters.capitalize(this.word); // how?
        }
    }
}

Я легко могу использовать фильтр в шаблоне следующим образом:

<span>The word is {{ word | capitalize }}</span>

Но как я могу использовать этот фильтр из метода экземпляра или вычисляемого свойства? (Очевидно, что этот пример тривиален, а мои настоящие фильтры более сложные).

Гарриг
источник

Ответы:

203
this.$options.filters.capitalize(this.word);

См. Http://vuejs.org/api/#vm-options

Моз Моррис
источник
13
Вы ... КРАСОТА !!
Mere Development
1
У меня это не работает в контексте Nuxt. this.$optionsне имеет filtersсобственности.
Джей Бьенвеню,
5
В использовании NuxtJSthis.$root.$options.filters
Эмануэль С.
28

Это то, что сработало для меня

  1. Определение фильтра

    //credit to @Bill Criswell for this filter
    Vue.filter('truncate', function (text, stop, clamp) {
        return text.slice(0, stop) + (stop < text.length ? clamp || '...' : '')
    });
    
  2. Использование фильтра

    import Vue from 'vue'
    let text = Vue.filter('truncate')(sometextToTruncate, 18);
    
Алексей Замковый
источник
Ошибка в этом ответе заключается в том, чтобы полагаться import Vue from 'vue'и создавать новую переменную, если она уже существует.
Джей Бьенвеню,
3

Вы можете создать vuexподобную вспомогательную функцию для сопоставления глобально зарегистрированных фильтров с объектом методов компонента vue:

// map-filters.js
export function mapFilters(filters) {
    return filters.reduce((result, filter) => {
        result[filter] = function(...args) {
            return this.$options.filters[filter](...args);
        };
        return result;
    }, {});
}

Применение:

import { mapFilters } from './map-filters';

export default {
    methods: {
        ...mapFilters(['linebreak'])
    }
}
Ахмад Мобараки
источник
1

если ваш фильтр что-то вроде этого

<span>{{ count }} {{ 'item' | plural(count, 'items') }}</span>  

это ответ

this.$options.filters.plural('item', count, 'items')
Уйгар
источник
0

В дополнение к ответу Морриса это пример файла, который я обычно использую для помещения фильтров внутрь, вы можете использовать его в любом представлении с помощью этого метода.

var Vue = window.Vue
var moment = window.moment

Vue.filter('fecha', value => {
  return moment.utc(value).local().format('DD MMM YY h:mm A')
})

Vue.filter('ago', value => {
  return moment.utc(value).local().fromNow()
})

Vue.filter('number', value => {
  const val = (value / 1).toFixed(2).replace('.', ',')
  return val.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.')
})
Vue.filter('size', value => {
  const val = (value / 1).toFixed(0).replace('.', ',')
  return val.toString().replace(/\B(?=(\d{3})+(?!\d))/g, '.')
})
Кико Сейджо
источник
Никогда не стоит объявлять что-то в глобальной области видимости, что windows.Vueи windows.momentделает, если в этом нет крайней необходимости, без каких-либо других способов.
J.Ko 03
Совсем неправда для этой темы! Глобально определенные фильтры для каждого проекта - хорошее правило!
Realtebo