2017-11-30 10 views
0

私はドロップダウン要素のために次のコードを持っています。ドロップダウン要素のオプションはデータベースからロードされ、正しく動作します。Vueウォッチハンドラがゼロ値でトリガーしない

すべての要素は、ゼロという値を持つ例外を除いて、ウォッチハンドラファインを起動します。要素自体にVue取得/設定の反応性プロパティがあることがわかりますが、ウォッチハンドラはゼロ値でドロップダウンオプションを選択したときに起動を拒否します。このアプリケーション用に作成されたデータベースシステムのすべてのデータを集約していることを示すため、絶対に実行できない限り、ゼロ値に保つ必要があります。それを0から変更すると、他のシステムも変更されます。ゼロ値がウォッチハンドラを起動しない理由についての洞察はありますか?

.select-site p Active Site: select(v-model='selectedSite') option(v-for='option in options', v-bind:value='option.value') | {{ option.text }}

let dataStore = new Vue({ 
    data: { 
    selectedSchoolValue: '', 
    schoolSites: [{ 
     text: 'Select a School', 
     value: '', 
     default: 1, 
    }] 
    }, 
    watch: { 

    selectedSchoolValue(newSelectedSchool, oldValue) { 

     if (newSelectedSchool !== oldValue) { 

     topbarVM.selectedSite = newSelectedSchool; 

     if (pageVM) { 
      pageVM.selectedSite = newSelectedSchool; 
     } 

     if (newSelectedSchool) { 
      document.cookie = `schoolSelectValue=${ newSelectedSchool };path=/`; 
     } 

     } 

     if (typeof loadVizData === 'function') { 
     loadVizData(); 
     } 

    } 

    } 
}); 

/*Populates school list from DB*/ 
const getSchoolsForSelect = (callback = null) => { 

    let self = dataStore; 

    GetSchools({}, (schools) => { 

    if (schools.status === 400) { 
     return location.href = "/login?message=Your%20session%20expired,%20please%20log%20in%20again."; 
    } 


    // strip trailing whitespace 
    schools.forEach((el) => { 
     el.schoolName = el.schoolName.trim(); 
    }); 

    // sort by alpha ascending on schoolName, except 
    // the District (siteId 70) should be forced to the top 
    schools.sort(function(a, b) { 
     if (b.siteId === 70) 
     return 1; 

     if (a.schoolName < b.schoolName || (a.siteId === 70 || b.siteId === 70)) 
     return -1; 

     if (a.schoolName > b.schoolName) 
     return 1; 

     return 0; 
    }); 

    // sort schools by schoolName, but force district to the top 
    // of the select (array element zero) 

    schools.forEach((el) => { 

     /*self.schoolSites.push({ 
      text: el.schoolName, 
      value: el.siteId, 
     });*/ 

     //below does not work. Vue Watcher for dropdown does not fire when the zero value is selected. 

     //force school 70 (district) to Id value 0 to match indicator system. Easier to do on front-end 
     if (el.siteId === 70) { 
     self.schoolSites.push({ 
      text: el.schoolName, 
      value: 0 
     }); 
     } else { 
     self.schoolSites.push({ 
      text: el.schoolName, 
      value: el.siteId, 
     }); 
     } 

    }); 

    callback && callback(); 

    }); 

}; 
+0

何あなたのドロップダウンは見えますか? ViewModelのメソッドはどのようにバインドされていますか? 'selectedSchoolValue'の値をどのように変更しますか? 'selectedSchoolValue'はどのように見えますか?ウォッチャーが実行されていないことを確認しますか?ウォッチャーの予想される副作用は発生していません(ウォッチャーは実行されていますが、期待された方法ではありません)。 – wing

+0

@wing Vue DevTools拡張機能を使用して、selectedSiteが実際に0に変化していることを確認しました。私はウォッチャーにブレークポイントを設定し、値0のオプションを除いて、selectedSiteの変更ごとに起動することを確認しました。私のドロップダウンとバインディングを表示するように更新されました。 –

答えて

0

私はウォッチャーで選択しようとしていると私は何の問題を見ていない...

new Vue({ 
 
    el: '#app', 
 
    data: { 
 
    options: [ 
 
     {id: 0, name: 'Please select...'}, 
 
     {id: 1, name: 'Option 1'}, 
 
     {id: 2, name: 'Option 2'}, 
 
     {id: 3, name: 'Option 3'}, 
 
    ], 
 
    selected: 0 
 
    }, 
 
    watch: { 
 
    selected (n, o) { 
 
     console.log(n, o) 
 
    } 
 
    } 
 
})
<div id="app"> 
 
    <select v-model="selected"> 
 
    <option v-for="{id, name} in options" :value="id"> 
 
     {{ name }} 
 
    </option> 
 
    </select> 
 
    
 
    <p>You select the option: {{ selected }}</p> 
 
</div> 
 

 
<script src="https://unpkg.com/[email protected]/dist/vue.min.js"></script>

+0

{id:0、name: 'Option 0'}の要素を追加してこれを試してみました。私のコードでこれが矛盾したり、これを止めたりするものがなければなりません。私は同じことを同じ時間に正確に同じ方法でロードしているので、私はそれが何であるかを正確にはわかりません。 –

+0

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - [レビューから](/レビュー/低品質の投稿/ 18116236) – M98

関連する問題