【问题标题】:How can I access one attached filter from another in Vue如何在 Vue 中从另一个过滤器访问一个附加的过滤器
【发布时间】:2019-02-19 13:17:34
【问题描述】:

我已经设置了一个文件来保存附加到我的 Vue 对象的过滤器,这是我的 App.js 中的 required。但是我有一个过滤器,理想情况下可以使用另一个过滤器:

Vue.filter('formatDateTime', value => {
    if (value)  return moment(String(value)).format('DD-MMM-YY hh:mm')
});
Vue.filter('getActivity', value =>
    (!value.lastvisited)
        ? 'Not visited yet' 
        : 'Last logged in ' + Vue.$options.filters.formatDateTime(value.lastvisited)
)

但是它不能引用全局 Vue 对象,有没有办法解决这个问题? 我当然可以重复日期格式代码,但我不想这样做。

【问题讨论】:

    标签: javascript vue.js filter


    【解决方案1】:

    一种选择是分开定义和全局注册

    (加上它现在在非 vue 上下文中可用/可导入)

    // ie. in filters.js
    export const formatDateTime = value => value 
      ? moment(String(value)).format('DD-MMM-YY hh:mm') 
      : null
    
    export const getActivity = value => !value.lastvisited
      ? 'Not visited yet' 
      : 'Last logged in ' + formatDateTime(value.lastvisited)
    
    // ie. in in a filter-global-registration.js
    import { getActivity, formatDateTime } from 'filters.js'
    
    Vue.filter('formatDateTime', formatDateTime);
    Vue.filter('getActivity', getActivity)
    

    【讨论】:

    • 只需要繁琐地重新输入我所有的过滤器来添加这个额外的抽象层,但我同意这是一种很好的结构化方式。它有效!这是一个奖励。
    • 这个解决方案在大多数情况下都有效,但是当您仍然需要在过滤器中使用 Vue 对象时(例如翻译插件或您可能需要的任何东西),您将不得不以某种方式获取对它的引用。
    • @Flame,正确,但我认为只要有东西需要this,它要么是computed,要么是methods,而不是(如我所见)无副作用的过滤器.即:codepen.io/anon/pen/MLxbEW
    【解决方案2】:

    我通常做的是创建一个对你的主 Vue 对象的全局引用,比如:

    // Create a filter which calls another filter.
    Vue.filter('myFilter', () => {
        window.Vue.$options.filters.myOtherFilter(...);
    });
    
    // Initialize the main Vue object.
    window.Vue = new Vue({
    
    });
    

    然后,您应该能够在过滤器函数中使用window.Vue.$options.filters.myOtherFilter() 访问您的过滤器。

    这可能并不理想,但它在一些情况下帮助了我,你必须定义不给你当前使用的 Vue 实例的插件/服务/组件。

    【讨论】:

    • 这正是我所做的,它也以window.Vue 失败,但是我以相反的方式完成了这些,在定义过滤器之前初始化了主 Vue 对象,不确定这是否重要在 JavaScript 世界里?
    • 我现在已经明确测试过了,它可以工作。您希望在创建 new Vue({}) 实例之前创建过滤器。请参阅vuejs.org/v2/guide/filters.html 它声明“......或在创建 Vue 实例之前全局定义一个过滤器”
    • 这很有趣,+1 参考文档,我现在采用了@birdspider 建议的方法,因为它还为解决方案添加了一些良好的代码结构
    猜你喜欢
    • 1970-01-01
    • 2021-03-17
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2012-10-19
    • 1970-01-01
    相关资源
    最近更新 更多