2017-06-20 110 views
1

我在VueJS中构建了我的第一个项目,并且无法使用v-if显示/隐藏模板。我有一个数据模型布尔变量(groups.categories.descEditable),我正在切换显示/隐藏模板。出于某种原因,当我更改该值时,模板不会自动更新。Vue模板不更新

<tbody v-for="group in groups"> 
    ... 
    <tr v-for="cat in group.categories"> 
     ... 
     <td class="td-indent"> 
      <input v-if="cat.descEditable" :value="cat.description" type="text" class="form-control"> 

      <div v-else v-on:click="editDesc(cat.id)">{{ cat.description }}</div> 


      <div>{{cat.descEditable}}</div> 
     </td> 
     ... 
    </tr> 
</tbody> 


methods: { 
    editDesc (cat_id) { 

     let vm = this 

     this.groups.forEach(function(group, gr_ind){ 
      group.categories.forEach(function(cat, ind) { 

       if (cat_id == cat.id) 
        cat.descEditable = true 
       else 
        cat.descEditable = false 
      }) 
     }) 
    } 
}, 

所以我想在文字输入显示,如果descEditable是真实的(一旦点击含有描述DIV),否则显示与静态描述值股利。 descEditable属性似乎正确更新,但输入元素上的v-if没有对它作出反应。我必须误解vuejs的一些基本内容,只是无法弄清楚它是什么。

+0

我发现模板状态实际上在内部更新,但它不是渲染上的某些原因。我通过调用vm。$ forceUpdate()找到了一个解决方案,但是这看起来并不是真正的“正确”答案。如果有人有更好的方法,请分享。 – user3246127

回答

2

我认为你可以完全抛弃editDesc方法。

console.clear() 
 

 
const groups = [ 
 
    { 
 
    categories:[ 
 
     { 
 
     descEditable: false, 
 
     description: "click me" 
 
     
 
     } 
 
    ] 
 
    } 
 
] 
 

 

 
new Vue({ 
 
    el:"#app", 
 
    data:{ 
 
    groups 
 
    } 
 
})
<script src="https://unpkg.com/[email protected]/dist/vue.js"></script> 
 
<div id="app"> 
 
    <table> 
 
    <tbody v-for="group in groups"> 
 
     <tr v-for="cat in group.categories"> 
 
     <td class="td-indent"> 
 
      <div v-if="cat.descEditable"> 
 
      <input v-model="cat.description" type="text" class="form-control"> 
 
      <button @click="cat.descEditable = false">Save</button> 
 
     </div> 
 
     <div v-else @click="cat.descEditable = true">{{ cat.description }}</div> 
 
     </td> 
 
     </tr> 
 
    </tbody> 
 
    </table> 
 
</div>

+0

优雅点,但它仍然无法正常工作。我发现模板状态实际上是内部更新的,但是由于某种原因它没有渲染。如果我更改组件文件然后保存,导致Vue开发服务器'刷新'dom,我可以获取它。显然这并不能解决我的问题。 有没有办法强制刷新Vue的DOM或其​​他“正确”的方式来确保更改得到呈现? – user3246127

+0

@ user3246127这是行不通的。有几个问题。我捏造了一些数据并将其转换为一个工作示例。将来,请提供一些可用于展示问题的数据或工作示例。使事情变得更容易。 – Bert

+0

奇怪的是,我无法让它为我工作(如果重要的话,我在组件中使用它)。我可以通过调用这个函数来获得我的工作。$ forceUpdate(),但是我更喜欢你的解决方案,只要我能让它工作。谢谢您的帮助。 – user3246127