首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于检测模型更改的Vue指令

用于检测模型更改的Vue指令
EN

Stack Overflow用户
提问于 2017-11-30 05:51:35
回答 2查看 6.6K关注 0票数 4

如何编写Vue 2.x指令,使其能够检测模型中的更改?我只能绑定到元素并检测输入、按键等,但不能检测模型何时更新。这是否超出了Vue指令的范围?

代码语言:javascript
复制
 Vue.directive('text-validation', {
        bind: function (el, binding, vnode) {
            el.addEventListener('input', function(){
            	console.log('only gets called on input, not model updates');
            });
        }
    });
    
new Vue({
	el: '#app',
  data: {
  	text: 'testing...'
  },
  mounted: function() {
  	setTimeout(function(){
       this.text = 'detected change';
    }.bind(this), 2000)
  }
})    
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.9/vue.js"></script>

<div id="app">
  <input v-model="text" v-text-validation=""/>
</div>

EN

回答 2

Stack Overflow用户

发布于 2017-11-30 07:12:15

啊,我忘了update钩子是用来干嘛的。我创建了一个工作代码片段,它完成了我想要做的事情-模型的更新调用了更新钩子

代码语言:javascript
复制
 Vue.directive('text-validation', {
        bind: function (el, binding, vnode) {
            el.addEventListener('input', function(){
            	console.log('got called');
            });
        },
        update: function(el, binding, vnode) {
        	console.log('got called on upadate');
        }
    });
    
new Vue({
	el: '#app',
  data: {
  	text: 'testing...'
  },
  mounted: function() {
  	setTimeout(function(){
       this.text = 'detected change';
    }.bind(this), 2000)
  }
})    
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.9/vue.js"></script>
<div id="app">
  <input v-model="text" v-text-validation=""/>
</div>

编辑

我最终在bind()钩子中设置了watch()。从update()内部触发任何类型的DOM本机事件都会导致各种无限循环。

伪码:

代码语言:javascript
复制
var modelExp = vnode.data.directives.find(d->d.name === 'model');
vnode.context.$watch(modelExp, function(){//do what i need}, {deep, true});

这是从“ListenerGenerator.prototype._attachModelWatcher”项目"VeeValidate“借来的

票数 6
EN

Stack Overflow用户

发布于 2017-11-30 06:23:55

正如@Bert指出的那样,你可以/可以使用观察者(如果你不需要更高级的东西-比如中央、州/商店、Vuex等)。

使用观察器--需要注意的是,你可以将它们与"deep: true“一起使用,也就是观察物体内部的孩子;

代码语言:javascript
复制
watch: {
    myData: {
      handler: function (newVal, oldVal) {
        // we have new and old values
      },
      deep: true /* we will be notified of changes also if myData.child is changed :) */
    }
  }

状态更复杂,但如果应用程序变得越来越复杂,它可以成为救世主……

我找到了这个简单实用的演示:Vue - Deep watching an array of objects and calculating the change?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47562456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档