2016-11-29 88 views
0

我使用日期選擇器並使用javascript將日期傳遞給vue實例,但在第一次使用v-for呈現列表後,當我調用功能與其他日期,它保持前一個數據顯示。 這裏是我的功能有:當Ajax更新數據時,無法更新v-for列表

function updateDate(fdate) { 
var datefieldVal = document.getElementById('date').value; 
var locationfieldVal = document.getElementById('location').value; 
if (datefieldVal && locationfieldVal) { 
    var tslot = new Vue({ 
     el: '#time-slots-container', 
     data: { 
      slot: {} 
     }, 
     mounted: function() { 
      this.fetchTimeslot(); 
     }, 
     methods: { 
      fetchTimeslot: function() { 
       var that = this; 
       $.ajax({ 
        type: "GET", 
        url: timeslotApiURL + "?date='" +fdate+ "'", 
        contentType: "application/json;", 
        dataType: "json", 
        success: function (data) { 
         that.slot = JSON.parse(data.d); 


         setTimeout(showTimeSlotAndButton, 500); 
        } 
       }); 

      } 
}); 
} 
} 

人有想法,如何更新使用新的時隙數據V型的名單?謝謝

回答

1

假設您的數據恢復正常,這可能只是slot不響應。嘗試:

success: function (data) { 
    Vue.set(that.$data, 'slot', JSON.parse(data.d)) 
    ... 

看上面的代碼,你應該避免每次你想更新日期時創建和安裝一個新的實例。我不確定Vue在這種情況下會做什麼,但它可能會失敗,因爲您無法將另一個實例掛載到現有的實例上。

改爲將所有Vue代碼移到updateDate函數之外。

然後,如果你需要,以防止V-從射擊,直到你擁有的數據,只需添加的dateReady數據PARAM這設置爲true,當你完成Ajax請求,即

data: { 
    slot: {}, 
    dateReady: false, 
}, 
... 

success: function (data) { 
    Vue.set(that.$data, 'slot', JSON.parse(data.d)) 
    that.dateReady = true 
    ... 

那麼你可以添加v-if="dateReady"v-for元素:

<div v-if="dateReady" class="time-slot-row" v-for="hourly in slot.TimeSlot"> 

你如何通過fdate Ajax請求現在處理方式不同,但你可以有這樣的:

var datefieldVal = document.getElementById('date').value; 
 
var locationfieldVal = document.getElementById('location').value; 
 

 
if (!datefieldVal || !locationfieldVal) 
 

 
\t return 
 
    
 
var tslot = new Vue({ 
 
    el: '#time-slots-container', 
 
    data: { 
 
     slot: {}, 
 
     dateReady: false, 
 
    }, 
 
    mounted: function() { 
 
     this.fetchTimeslot(); 
 
    }, 
 
    methods: { 
 
     fetchTimeslot: function() { 
 
      var that = this; 
 
      $.ajax({ 
 
       type: "GET", 
 
       url: timeslotApiURL + "?date='" + that.getDate() + "'", 
 
       contentType: "application/json;", 
 
       dataType: "json", 
 
       success: function(data) { 
 
        that.slot = JSON.parse(data.d); 
 
        that.dateReady = true 
 
        setTimeout(showTimeSlotAndButton, 500); 
 
       } 
 
      }); 
 

 
     }, 
 
     getDate() { 
 
      // whatever you do here 
 
      return '' 
 
     }, 
 
    }, 
 
}) 
 

 
// wherever else you are using this... 
 
tslot.fetchTimeslot()

從本質上講,你將更多的邏輯到Vue公司的情況下,即getDate()如果這是不可能的,那麼你可以設置一個參數去抱着你想獲取日期,使用,在ajax調用並創建一個新的方法來更新它。圍繞它,但方式很多,主要問題是確保你只需要綁定到#time-slots-container元素

+0

嗨,GuyC,謝謝你的回覆。是的,我檢查了收到的數據是正確的,使用上面的語法後,也似乎不工作,它保留了前一個數據。我認爲槽數據已經改變,只是呈現列表沒有反應,任何想法? – Winston

+0

抱歉,剛剛注意到您每次運行updateDate時都試圖重建vue實例。更新回答 – GuyC

+0

將Vue代碼移到updateDate函數之外後,如何調用並將update日期參數傳遞給updateDate函數中的vue? – Winston

0

這裏VUE的單個實例是V-代碼:

   <div class="time-slots-list-container"> 
       <p class="description"><%=GetGlobalResourceObject("OPTBSRES","SelectedStartTime") %> <span v-if="slot.SelectedSlot==null"><%=GetGlobalResourceObject("OPTBSRES","ToBeSelect") %></span><span v-if="slot.SelectedSlot!=null">{{slot.SelectedSlot}}</span> <%=GetGlobalResourceObject("OPTBSRES","ExamTimeReminderMsg") %></p> 
        <div class="time-slot-row" v-for="hourly in slot.TimeSlot"> 
         <div class="hourly-indicator"><span class="time">{{hourly.Hour}}</span></div> 
         <ul class="time-slots-list"> 
          <li v-for="timeslot in hourly.Slots" class="time-slot" v-bind:class="{'selected': timeslot.Status=='selected', 'unavailable': timeslot.Status =='unavailable', 'active': timeslot.Status=='available'}" v-on:click="updateSelectedSlot(hourly,timeslot), timeslot.Status='selected'"> 
           <span class="time">{{timeslot.Time}}</span> 
           <div class="selected-indicator"><span aria-hidden="true" class=" fa fa-check-circle" aria-hidden="true"></span></div> 
          </li> 
         </ul> 
        </div> 
      </div> 
0

您需要返回data作爲方法,而不僅僅是一個對象,以便它是被動的。

var tslot = new Vue({ 
    el: '#time-slots-container', 
    data() { 
    return { 
     slot: {} 
    } 
    }, 
    // etc 

您還可以使用this.$http.get({})作爲一個承諾,這將刪除你的整個jQuery的混亂。

然後你就可以用一份豐厚的箭頭=>獲得這個詞彙進入你的諾言,所以你不必繞過上下文(that

如果一切那麼你的數據應該是反應性。

+0

嗨,darryn.ten,感謝您的回覆。 y,我是使用vue.js的初學者,你能解釋一下如何使用=>來響應數據,謝謝〜 – Winston

+0

你實際上不需要這樣做,因爲你正在使用你的data屬性根實例,如果它是一個組件,則上述內容是正確的。 – GuyC

+0

你可以閱讀關於[這裏](https://babeljs.io/docs/learn-es2015/#arrows-and-lexical-this) –