码迷,mamicode.com
首页 > 其他好文 > 详细

Vue2自定义指令改变DOM值后未刷新data中绑定属性的值

时间:2017-11-29 19:56:00      阅读:794      评论:0      收藏:0      [点我收藏+]

标签:技术   only   remove   试验   str   通过   http   inpu   hold   

标签(空格分隔): Vue


自定义指令用于过滤输入框,只允许输入数字:

Vue.directive(‘numberOnly‘, {
    bind: function (el, binding) {
        el.handler = function () {
            el.value = el.value.replace(/[^\d]/g, ‘‘);
        }
        el.addEventListener(‘input‘, el.handler);
    },
    unbind: function (el) {
        el.removeEventListener(‘input‘, el.handler);
    }
});

在DOM中使用如下所示:

<input type="text" name="image-code" class="input" placeholder="图片验证码" autocomplete="off" v-model="imageCode" v-number-only />

此时可以实现在输入框中只能输入数字,输入其它字符不予显示。但是在提交表单的时候使用this.imageCode却发现,字符中有一个刚才试验的非数字字符,如图所示:

技术分享图片

这该怎么办呢?通过阅读文档,我目前使用传递自定义指令value属性的方法来data中的属性赋值。使用这个方法,可以不绑定v-mode="",当然绑定了也没什么区别:

Vue.directive(‘numberOnly‘, {
    bind: function (el, binding) {
        el.handler = function () {
            el.value = el.value.replace(/[^\d]/g, ‘‘);

            // 手动刷新data中绑定的属性
            binding.value.set[binding.value.name] = el.value;
        }
        el.addEventListener(‘input‘, el.handler);
    },
    unbind: function (el) {
        el.removeEventListener(‘input‘, el.handler);
    }
});

此时在DOM中就需要传递两个属性:

<input type="text" name="image-code" class="input" placeholder="图片验证码" autocomplete="off" v-model="imageCode" v-number-only="{ set: this, name: ‘imageCode‘ }" />

这样this.imageCode当中就不会出现非数字字符串了。

你可能想说,直接在set中指定this.imageCode,然后在自定义指令中binding.value.set = el.value;,不就可以了嘛。然而经过测试这样是起不到作用的。

这个方案并不优雅,如果有其它解决方案,还望不吝赐教。

Vue2自定义指令改变DOM值后未刷新data中绑定属性的值

标签:技术   only   remove   试验   str   通过   http   inpu   hold   

原文地址:http://www.cnblogs.com/jehorn/p/7922101.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!