2017-06-28 70 views
0

我使用[email protected][email protected]vue2-selectize。 我有一個很大的形式與幾個選擇輸入。 所有選項都通過AJAX加載到一個屬性,它是通過AJAX數據被替換之前與演示數據初始化:selectize.js和vue.js 2 ajax加載optons

addTrackData : { 

    styles : [ 
     { id: 1, title: 'style 1' }, 
     { id: 2, title: 'style 3' }, 
     { id: 3, title: 'style 2' }, 
    ], 
    authors: [ 
     {inn: '111', name: 'demo 1'}, 
     {inn: '222', name: 'demo 2'}, 
     {inn: '333', name: 'demo 3'} 
    ] 
    .... 
}, 

而且我有2個問題:

1)如果我使用在這樣的設置,選擇不加載在所有:

<selectize v-model="form.data.authors[i]['id']" :settings="selectize.authors"></selectize> 

selectize: { 
    authors: { 
     valueField: 'inn', 
     labelField: 'name', 
     searchField: ['name', 'inn'], 
     options: this.addTrackData.authors // that doesn't works, but hard coded array works 
    } 
} 

由於錯誤Error in data(): "TypeError: Cannot read property 'authors' of undefined"的。 this.addTrackData.authorsaddTrackData.authors都出現此錯誤。

但這樣工作的:

<selectize v-model="form.data.authors[i]['id']" 
    :settings=" { 
     valueField: 'inn', 
     labelField: 'name', 
     searchField: ['name', 'inn'], 
     options: addTrackData.authors, // It works, but looks too ugly! 
    }" > 
</selectize> 

2)選項不具反應 - 當AJAX數據到來時,所有的選擇元素仍然顯示了一個演示數據。我不知道如何更新他們... ...

UPDATE

問題二可以固定如果條件和空初始數組:

<selectize v-if="addTrackData.authors.length" v-model="form.data.authors[i]['id']" 
    :settings=" { 
     valueField: 'inn', 
     labelField: 'name', 
     searchField: ['name', 'inn'], 
     options: addTrackData.authors, // It works, but looks too ugly! 
    }" > 
</selectize> 

addTrackData : { 
    styles : [], 
    authors: [] 
    .... 
} 

但第一個問題還是讓我哭泣

+0

當數據來自服務器時,嘗試使用'this。$ set(this,'addTrackData',receivedData)'設置'addTrackData'。 –

+0

沒有任何變化 – fiter

+0

您可以嘗試的另一件事是將您的'addTrackData.authors'放入**計算屬性**中,並在您的選擇設置中使用它的引用。 –

回答

2

我剛剛讀了vue2-selectize的源代碼,並注意到它的手錶代碼爲options,密鑰不正確。

他的代碼是這樣:

watch: { 
    value() { 
    this.setValue() 
    }, 
    options (value, old) { 
    if (this.$el.selectize && !equal(value, old)) { 
     this.$el.selectize.clearOptions() 
     this.$el.selectize.addOption(this.current) 
     this.$el.selectize.refreshOptions(false) 
     this.setValue() 
    } 
    } 
}, 

,而應該是這樣工作的:

watch: { 
    value() { 
    this.setValue() 
    }, 
    options (value, old) { 
    if (this.$el.selectize && !equal(value, old)) { 
     this.$el.selectize.clear(); 
     this.$el.selectize.clearOptions(); 
     var vm = this; 
     this.$el.selectize.load(function(callback) { 
     callback(vm.current); 
     }); 
     this.$el.selectize.refreshOptions(false); 
     this.setValue(); 
    } 
    } 
}, 

我只準備了哈克的方式,使其工作,但我不建議你使用它在生產中。

這裏是小提琴的鏈接:https://jsfiddle.net/ahmadm/h8p97hm7/

我會盡力盡快發送pull請求,他的創造者儘可能但直到那個時候,您的解決方案已經是唯一可能的解決方案。

+2

我只是想添加我的[演示小提琴](https://jsfiddle.net/awolf2904/n4mz318x/)作爲一種可能的解決方法。但我也建議分叉vue2-selectize並改善手錶部分。 – AWolf

+1

謝謝@AWolf,你的小提琴也提出了一個乾淨的方式來做到這一點。我認爲,有必要儘快分叉並改進'vue2-selectize'。我明天會發出拉請求。 –

+0

謝謝你們!看起來像沒有辦法只使用'options:this.addTrackData.authors'? – fiter