假设我有一个像这样绑定的输入元素:
<input :value="somedata">
用户在输入中键入内容,由于我没有使用v-model
或通过处理程序更改somedata
,因此元素的值现在与somedata
不同。这就是我想要的,但我也想拥有以下功能:
在不更改somedata
的值的情况下,我希望能够通知元素,以便再次将其值设置为somedata
。类似于淘汰赛的notifySubscribers()
或valueHasMutated()
这可能在vue.js吗?
更新:此处明确说明问题: https://jsfiddle.net/gtezer5c/3/
答案 0 :(得分:2)
我不确定我是否正常关注,但我会试一试。
我认为你想要的只是在他们的&#34;临时&#34;价值满足某种条件。以下是我的想法。
<div id="app">
<input v-model="tempValues.one">
<input v-model="tempValues.two">
<input v-model="tempValues.three">
<pre>{{ values }}</pre>
<pre>{{ tempValues }}</pre>
</div>
然后,在我的组件中,我会看到tempValues
并且仅在满足条件时更新values
。
new Vue({
el: '#app',
data: {
values: {
one: '',
two: '',
three: '',
},
tempValues: {},
},
created () {
// Create the tempValues based on the real values...
this.tempValues = Object.assign({}, this.values)
},
methods: {
updateValues (tempValues) {
// Only updating the values if all the tempValues are longer than 3 characters...
var noneEmpty = Object.values(tempValues).every((value) => value.length > 3)
if (noneEmpty) {
this.values = Object.assign({}, tempValues)
}
},
},
watch: {
// Watch tempValues deeply...
tempValues: {
handler (tempValues) {
this.updateValues(tempValues)
},
deep: true,
},
},
})
答案 1 :(得分:2)
根据您的需求解释确切的要求和验收标准有点困难,我认为比尔的解决方案就是您所追求的,但经过所有更新和澄清,我想我更了解您的内容我试图完成:简而言之,我认为你需要一种通用的方法来获得一个可以保存一个值但可以独立地恢复到其他值的输入。
请查看this CodePen。我相信它正在提供你想要做的事情。它允许您创建input
元素作为revertable
组件,可以选择传递默认值。对该输入的任何更改都由具有value
数据属性的组件维护。它不会观察/拉入任何lastKnownGood
类型的值,因为任何反转都将从外部推送到组件中。
在revertable
组件的外部,您可$emit
revert
个revertable
事件,其新值将导致所有revertable
个组件或单个const revertBus = new Vue()
要恢复的组件(具有匹配的ID)。
我觉得它主要是一个干净的解决方案(假设我正确理解了这些要求),除了在VueJS 2中我们必须使用一个独立的共享Vue对象来在没有父子关系时传递事件。所以你会看到:
revertable
在演示的全局范围中定义。 revertBus.$on('revert', (value, id) => { ... }
组件将使用它来接收传入的消息,如下所示:
revertBus.$emit('revert', this.reversionValue, targetId)
并且触发消息的控制Vue对象将使用它:
null
您还可以使用revertable
值发出事件,以使revertBus.$emit('revert', null, targetId)
组件将其值重置为其初始默认值:
*
同样,它是一个主要干净的解决方案,虽然它可能与你想要完成的内容完全吻合,但我希望它至少可以帮助你更接近。
答案 2 :(得分:1)
yourvar.__ob__.dep.notify()
适用于对象和数组
答案 3 :(得分:0)
是的,您应该可以在v-on:input
的帮助下完成此操作。您可以在input
上调用函数,并在此函数中设置检查和更新的逻辑:
<input :value="somedata" v-on:input="yourMethod">
事实上,如果你看一下documentation,<input v-model="something">
就是语法糖:
<input v-bind:value="something" v-on:input="something = $event.target.value">
所以不要将变量something
分配给输入的值,而是将逻辑放在那个位置。