2017-06-14 56 views
2

我有一張表格,使用ajax獲取數據。我試圖建立一個表,其中每行都有一個關聯的隱藏行,並單擊該行來切換隱藏行的顯示。隱藏的行包含手風琴。VueJS手風琴表 - 出現在表格外

問題是,手風琴已經搞亂了,並在表格的底部顯示,而不是顯示在它被點擊的特定行下面。

我的代碼如下:

<table class="table table-striped table-bordered table-hover"> 
    <thead> 
     <tr> 
     <th v-for="column in columns"> 
      <span v-if="column == 'Predictive Price'"> 
       {{column}} 
       <i class="fa fa-info-circle" v-tooltip="msg"></i> 
      </span> 
      <span v-else-if="column == 'Actual Price'"> 
       {{column}} 
      <i class="fa fa-info-circle" v-tooltip="tooltip.actual_price"></i> 
           </span> 
           <span v-else> 

           {{column}} 
           </span> 
          </th> 
          <th>Actions</th> 
         </tr> 

        </thead> 

        <tbody> 
         <tr v-for="row in model" @click="showRow"> 

          <td> 
           {{row.id}} 
          </td> 

          <td> 
           {{row.company_customer.customer_name}} 
          </td> 

          <td> 
           <i class="fa fa-map-marker"></i> 
           <small> 
           {{row.pickup_addr.address_1}}, {{row.pickup_addr.city}}, {{row.pickup_addr.postcode}} 
           </small> 
          </td> 

          <td> 
           <i class="fa fa-map-marker"></i> 
           <small> 
            {{row.pickup_addr.address_1}}, {{row.pickup_addr.city}}, {{row.pickup_addr.postcode}} 
           </small> 
          </td> 

          <td> 
           &pound;{{row.predictive_price}} 
          </td> 

          <td> 
           &pound;{{row.actual_price}} 
          </td> 

          <td> 
           n/a 
          </td> 

          <tr> 
          <td colspan="7" v-if="contentVisible"> 
            <div class="accordian-body"> 
             ACCORDION 
            </div> 
          </td> 
          </tr> 

         </tr> 



        </tbody> 
       </table> 


<script> 

export default { 

    methods: { 
     data() { 
      return { 
      msg: 'This is just an estimation!', 

      tooltip: { 
       actual_price: 'Click on the price to edit it.' 
      }, 

      contentVisible: false, 

      } 
     }, 
     rowRow() { 
      this.contentVisible = !this.contentVisible; 
     } 
    } 

} 

</script> 

我在哪裏可以把手風琴格,以便它能夠正確顯示?

編輯:

請參閱小提琴:https://jsfiddle.net/49gptnad/355/

+0

你把你的手風琴'tr'放在另一個'tr'裏面。把它放在後面。一個'tr'不能是另一個'tr'的孩子。 –

+0

@RoyJ請看這個小提琴:正如你所看到的,它不符合我的需要:https://jsfiddle.net/49gptnad/355/甚至把它放在'tr'外面 – Phorce

+0

手風琴是應該的嗎?成爲一排還是它在一個單元格?或者說,看起來你想爲每一排提供手風琴? – Bert

回答

3

這聽起來像你想與每一行相關聯的手風琴,所以真的,你要行爲您的數據的各個項目。

您可以通過將您的v-for移動到template標籤來實現這一點,該標籤包裝兩行。

此外,您需要控制內容是否在逐行基礎上可見,因此將contentVisible屬性添加到每個數據項並使用它來控制第二行是否可見。

console.clear() 
 

 
var vm = new Vue({ 
 
    el: '#vue-instance', 
 
    data: { 
 
    testing: [{ 
 
     id: 1, 
 
     name: "Customer 1", 
 
     contentVisible: false 
 

 
     }, 
 
     { 
 
     id: 2, 
 
     name: "Customer 1", 
 
     contentVisible: false 
 

 
     }, 
 
     { 
 
     id: 3, 
 
     name: "Customer 3", 
 
     contentVisible: false 
 

 
     }, 
 
    ], 
 
    columns: ["id", "name"] 
 
    }, 
 

 
    mounted() { 
 
    console.log(this.testing); 
 
    }, 
 

 
    methods: { 
 
    showRow(data) { 
 
     this.contentVisible = !this.contentVisible; 
 

 
    } 
 

 
    } 
 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.js"></script> 
 
<div id="vue-instance"> 
 
    <table class="table table-striped table-bordered table-hover"> 
 
    <thead> 
 
     <tr> 
 
     <th v-for="column in columns"> 
 
      {{column}} 
 
     </th> 
 
     </tr> 
 
    </thead> 
 

 
    <tbody> 
 
     <template v-for="row in testing"> 
 
     <tr @click="row.contentVisible = !row.contentVisible"> 
 
      <td>{{row.id}}</td> 
 
      <td>{{row.name}}</td> 
 
     </tr> 
 
     <tr v-if="row.contentVisible"> 
 
      <td :colspan="columns.length" > 
 
      <div class="accordian-body"> 
 
       afasfafs 
 
      </div> 
 
      </td> 
 
     </tr> 
 
     </template> 
 
    </tbody> 
 
    </table> 
 
</div>

這裏是你的更新fiddle

+0

我剛剛意識到一些東西..我得到你的實現'row.contentVisible =!row.contentVisible'然而,在我的例子中(jsfiddle只是一個例子)我使用'store',它返回一個數據對象'axios'請求..我在這個數據中沒有'row.contentVisible' ..是否有可能爲每個數據添加一行或者簡單地以另一種方式處理? – Phorce

+0

@phorce只需在'axios'響應處理程序中使用'map'將該屬性添加到數據。 – Bert

+0

雖然會是一個解決方案,但這個應用程序是實時的。所以通過添加一個地圖到商店不會工作,因爲每次更新的東西都會關閉手風琴! – Phorce