Vue js在输入字段中对v-model应用过滤器

新手上路,请多包涵

希望可以有人帮帮我!我已经制定了一个指令,将 Jasny Bootstrap 插件更具体地包装为输入掩码,一切顺利!

现在我制作了一个自定义过滤器,支持时刻来格式化日期字段!

我从后端应用程序收到的日期格式是 YYY-MM-DD,我必须在视图上显示为 DD/MM/YYYY…我试过 v-model="date | myDate" 但它不能正常工作!

JS

 Vue.directive('input-mask', {
  params: ['mask'],

  bind: function() {
    $(this.el).inputmask({
      mask: this.params.mask
    });

  },
});

Vue.filter('my-date', function(value, formatString) {

  if (value != undefined)
    return '';

  if (formatString != undefined)
    return moment(value).format(formatString);

  return moment(value).format('DD/MM/YYYY');

});

var vm = new Vue({
  el: 'body',
  data: {
    date: '2015-06-26',
  }
});

HTML

 <label>Date</label>
<input type="text" class="form-control" v-input-mask mask="99/99/9999" v-model="date">
<p>{{ date | myDate 'dd/mm/yyyy' }}</p>

如果有人感兴趣,这里有 JSBin

提前致谢!

编辑:更好地解释我的期望=)

当页面第一次加载时,输入接收到 2015-06-26 的值,我想将该值显示为 DD/MM/YYYY 所以 26/06/2015!只有在我开始输入内容后它才能正常工作!

原文由 Gustavo Bissolli 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 667
2 个回答

我了解您正在尝试做什么,但是,由于使用 v-model 时的两种方式绑定,最好在从服务器接收到日期时格式化日期,然后以所需的格式使用它您的前端应用程序( 'DD/MM/YYYY' )。

将数据发送回后端时,只需将其格式化回所需的服务器格式( 'YYYY-MM-DD' )。

在您的 Vue 应用程序中,工作流程将是这样的:

  new Vue({
    el: 'body',
    data: {
      date: null,
    },
    methods: {
        getDataFromServer: function() {
                // Ajax call to get data from server

                // Let's pretend the received date data was saved in a variable (serverDate)
                // We will hardcode it for this ex.
                var serverDate = '2015-06-26';

                // Format it and save to vue data property
                this.date = this.frontEndDateFormat(serverDate);
        },
        saveDataToServer: function() {
            // Format data first before sending it back to server
            var serverDate = this.backEndDateFormat(this.date);

            // Ajax call sending formatted data (serverDate)
        },
        frontEndDateFormat: function(date) {
            return moment(date, 'YYYY-MM-DD').format('DD/MM/YYYY');
        },
        backEndDateFormat: function(date) {
            return moment(date, 'DD/MM/YYYY').format('YYYY-MM-DD');
        }
    }
  });

这对我来说很好,希望它有所帮助。

这是一个小提琴:

https://jsfiddle.net/crabbly/xoLwkog9/

语法更新:

     ...
    methods: {
        getDataFromServer() {
                // Ajax call to get data from server

                // Let's pretend the received date data was saved in a variable (serverDate)
                // We will hardcode it for this ex.
                const serverDate = '2015-06-26'

                // Format it and save to vue data property
                this.date = this.frontEndDateFormat(serverDate)
        },
        saveDataToServer() {
            // Format data first before sending it back to server
            const serverDate = this.backEndDateFormat(this.date)

            // Ajax call sending formatted data (serverDate)
        },
        frontEndDateFormat(date) {
            return moment(date, 'YYYY-MM-DD').format('DD/MM/YYYY')
        },
        backEndDateFormat(date) {
            return moment(date, 'DD/MM/YYYY').format('YYYY-MM-DD')
        }
    }
  })

原文由 crabbly 发布,翻译遵循 CC BY-SA 4.0 许可协议

当我想将输入值大写时,我遇到了类似的问题。

这就是我最终做的事情:

 // create a directive to transform the model value
Vue.directive('uppercase', {
  twoWay: true, // this transformation applies back to the vm
  bind: function () {
    this.handler = function () {
      this.set(this.el.value.toUpperCase());
    }.bind(this);
    this.el.addEventListener('input', this.handler);
  },
  unbind: function () {
    this.el.removeEventListener('input', this.handler);
  }
});

然后我可以在 v-model 的输入字段上使用这个指令。

 <input type="text" v-model="someData" v-uppercase="someData">

现在,每当我在此字段中键入或更改 someData 时,该值都会转换为大写。

这基本上和我希望 v-model="someData | uppercase" 会做的事情一样。但当然,你不能那样做。

总而言之:制作一个 _转换数据的指令,而不是一个过滤器_。

原文由 james2doyle 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题