2015-11-06 9 views
10

テーブルにユーザーのリストを表示しています。各行にはユーザーを選択するチェックボックスがあり、チェックボックスの値はユーザーのIDです。選択したIDは、表の下のスパンに表示されます。すべてのチェックボックスをチェックするvuejs

テーブルのヘッダーにある「すべて選択」チェックボックスのチェックボックスをすべてオフにして、すべてのチェックボックスを選択解除するにはどうすればよいですか?これを行うにはDOMとやりとりするのか、それともvueオブジェクトを使うのか、私はそれが後者であるべきだと思っていますが、簡単な作業のように見えるものにはどうやって接近するのかがはっきりしていませんか?どんな助けもありがとう!

HTML

<div id="app"> 
    <h4>Users</h4> 
    <div> 
     <table> 
      <tr> 
       <th>Name</th> 
       <th>Select <input type="checkbox" @click="selectAll"></th> 
      </tr> 
      <tr v-for="user in users"> 
       <td>{{ user.name }}</td> 
       <td><input type="checkbox" v-model="selected" value="{{ user.id }}"></td> 
      </tr> 
     </table> 
    </div> 

    <span>Selected Ids: {{ selected| json }}</span> 
</div> 

Javascriptを/ Vuejs

new Vue({ 
    el: '#app', 
    data: { 
     users: [ 
      { "id": "1", "name": "Shad Jast", "email": "[email protected]", 
      { "id": "2", "name": "Duane Metz", "email": "[email protected]"}, 
      { "id": "3", "name": "Myah Kris", "email": "[email protected]"}, 
      { "id": "4", "name": "Dr. Kamron Wunsch", "email": "[email protected]"}, 
      { "id": "5", "name": "Brendon Rogahn", "email": "[email protected]"} 
     ], 
     selected: [] 
    }, 
    methods: { 
     selectAll: function() { 
      // ? 
     } 
    } 
}) 

答えて

3

(と思います?)。

解決策はすべてを選択して選択します。

HTML

<div id="app"> 
    <h4>User</h4> 
     <div> 
      <table> 
       <tr> 
        <th>Name</th> 
        <th>Select <input type="checkbox" @click="selectAll" v-model="allSelected"></th> 
       </tr> 
       <tr v-for="user in users"> 
        <td>{{ user.name }}</td> 
        <td><input type="checkbox" v-model="userIds" value="{{ user.id }}"></td> 
       </tr> 
      </table> 
     </div> 

     <span>Selected Ids: {{ userIds | json }}</span> 
</div> 

Javascriptを/ Vuejs

フィドルの作業
new Vue({ 
    el: '#app', 
    data: { 
     users: [ 
      { "id": "1", "name": "Shad Jast", "email": "[email protected]"}, 
      { "id": "2", "name": "Duane Metz", "email": "[email protected]"}, 
      { "id": "3", "name": "Myah Kris", "email": "[email protected]"}, 
      { "id": "4", "name": "Dr. Kamron Wunsch", "email": "[email protected]"}, 
      { "id": "5", "name": "Brendon Rogahn", "email": "[email protected]"} 
     ], 
     selected: [], 
     allSelected: false, 
     userIds: [] 
    }, 
    methods: { 
     selectAll: function() { 
      this.userIds = []; 

      if (!this.allSelected) { 
       for (user in this.users) { 
        this.userIds.push(this.users[user].id); 
       } 
      } 
     }, 
    } 
}) 

:分かりやすい少ない特性を有するhttps://jsfiddle.net/okv0rgrk/3747/

+0

問題:1)すべてを選択してください。 2)1項目を選択解除します。 SelectAllチェックボックスが選択されなくなります。 – Sigma

+0

@Sigma良いキャッチ、私はフィドルに修正を加えました、おそらく素晴らしい解決策ではありませんが、それは機能します。お気軽にあなた自身の解決策を投稿してください。 – haakym

+0

メソッドselectAllでは、if(!this.allSelected)ではなくif(this.allSelected)でなければなりません。使用する必要はありません! 。 –

1

それはあなたがそれらの値を参照している方法ですので、あなたがしなければならないのは、自分のIDを使用して、ユーザーを追加することですチェックボックスを選択し、選択した配列に追加します。 nhydockによって答えの編集が受け入れられなかったように私自身の答えを追加

selectAll: function() { 
    this.selected = []; 
    for (user in this.users) { 
     this.selected.push(this.users[user].id); 
    } 
} 

Running JSFiddle

+0

感謝。それはすべての値を選択するのにうまく機能しますが、選択を解除するのはどうですか? – haakym

+0

私は、選択したすべてが真か偽かをチェックし、偽の場合はすべてを選択から外すことができると推測していますか?あなたのバイブルで試してみよう。 – haakym

+0

Woo!それが働いて、私はあなたの答えを少し更新するつもりです、それは大丈夫ですか?あなたのフィドルを解決策で更新しました。あなたの助けをお寄せいただきありがとうございます – haakym

4

どのように私の答えについては、?

new Vue({ 
 
    el: '#app', 
 
    data: { 
 
    users: [{ 
 
     "id": "1", 
 
     "name": "Shad Jast", 
 
     "email": "[email protected]", 
 
     'checked': false 
 
    }, { 
 
     "id": "2", 
 
     "name": "Duane Metz", 
 
     "email": "[email protected]", 
 
     'checked': false 
 
    }, { 
 
     "id": "3", 
 
     "name": "Myah Kris", 
 
     "email": "[email protected]", 
 
     'checked': false 
 
    }, { 
 
     "id": "4", 
 
     "name": "Dr. Kamron Wunsch", 
 
     "email": "[email protected]", 
 
     'checked': false 
 
    }, ], 
 

 
    }, 
 
    computed: { 
 
    selectAll: function() { 
 
     return this.users.every(function(user){ 
 
     return user.checked; 
 
     }); 
 
    } 
 
    }, 
 
    methods: { 
 
    toggleSelect: function() { 
 
     var select = this.selectAll; 
 
     this.users.forEach(function(user) { 
 

 
     user.checked = !select; 
 

 
     }); 
 
     this.selectAll = !select; 
 
    }, 
 

 
    } 
 
});
<script src="https://cdn.jsdelivr.net/vue/latest/vue.js"></script> 
 

 
<div id="app"> 
 
    <h4>User</h4> 
 
    <div> 
 
    <table> 
 
     <tr> 
 
     <th>Name</th> 
 
     <th>Select 
 
      <input type="checkbox" @click="toggleSelect" :checked="selectAll"> 
 
     </th> 
 
     </tr> 
 
     <tr v-for="user in users"> 
 
     <td>{{ user.name }}</td> 
 
     <td> 
 
      <input type="checkbox" v-model="user.checked"> 
 
     </td> 
 
     </tr> 
 
    </table> 
 
    </div> 
 

 
</div>

+0

"checked"を持つ各データ項目に依存していると思います:false'? – haakym

+0

'this.selectAll =!select;'は不要です。なぜなら、this.selectAllは、すべてのユーザーのチェックされたプロパティがチェックされているかどうかに依拠しています〜 –

20

私はジェレミーの答え@だと思うきれいな方法であるが、それはデータがAPIリクエストから来た場合には意味がありませんされている各ユーザーオブジェクトにcheckedプロパティに必要。ここで

が動作を選択/ユーザオブジェクト上checkedプロパティを追加することなく、すべての行の選択を解除するためのクリーンなコードされています

new Vue({ 
 
    el: '#app', 
 
    data: { 
 
     users: [ 
 
      { "id": "1", "name": "Shad Jast", "email": "[email protected]" }, 
 
      { "id": "2", "name": "Duane Metz", "email": "[email protected]" }, 
 
      { "id": "3", "name": "Myah Kris", "email": "[email protected]" }, 
 
      { "id": "4", "name": "Dr. Kamron Wunsch", "email": "[email protected]" } 
 
     ], 
 
     selected: [] 
 
    }, 
 
    computed: { 
 
     selectAll: { 
 
      get: function() { 
 
       return this.users ? this.selected.length == this.users.length : false; 
 
      }, 
 
      set: function (value) { 
 
       var selected = []; 
 

 
       if (value) { 
 
        this.users.forEach(function (user) { 
 
         selected.push(user.id); 
 
        }); 
 
       } 
 

 
       this.selected = selected; 
 
      } 
 
     } 
 
    } 
 
});
<script src="https://cdn.jsdelivr.net/vue/latest/vue.js"></script> 
 

 
<div id="app"> 
 
<h4>User</h4> 
 
<div> 
 
    <table> 
 
     <tr> 
 
      <th><input type="checkbox" v-model="selectAll"></th> 
 
      <th align="left">Name</th> 
 
     </tr> 
 
     <tr v-for="user in users"> 
 
      <td> 
 
       <input type="checkbox" v-model="selected" :value="user.id" number> 
 
      </td> 
 
      <td>{{ user.name }}</td> 
 
     </tr> 
 
    </table> 
 
</div> 
 
</div>

行のチェックボックスにnumber属性が必要であることに注意してくださいそれ以外の場合は、ユーザID selectAllを文字列としてプッシュする必要があります。selected.push(user.id.toString());

+0

非常にスマートでクリーンなソリューションです:)ありがとう。 p.s.最初にthis.selected = selected; –

+0

@KarolFiturskiああ、ありがとう、頭をアップ、それを更新します。 – Rifki

+1

user.id.toString()manあなたは真剣に私の人生を救った。 3時間ぐるぐる回し – TheMan68

1

誰もがソリューションを分かち合うことができます。それは学習の大きな助けとなっています。デフォルトのチェックボックスを追加して、 "default"というプロパティがtrueに設定されている配列のサブセットを選択するのに役立ちました。ここ

は、コードは次のとおりです。ご返信用

// based on https://jsfiddle.net/okv0rgrk/3747/ 
 

 
new Vue({ 
 
    el: '#app', 
 
    data: { 
 
     selected: [], 
 
     defaultSelects: [], 
 
     selectsArray: [ 
 

 
      {id: 'automotive', name: 'Automotive', class: 'industry', default: false}, 
 

 
      {id: 'beauty', name: 'Beauty', class: 'industry', default: true}, 
 

 
      {id: 'branding', name: 'Branding', class: 'industry', default: true}, 
 

 
      {id: 'btob', name: 'B to B', class: 'industry', default: false} 
 
     ], 
 
     selected: [], 
 
    }, 
 
    computed: { 
 
     defaultChecked: { 
 
     get() { 
 
      let defaults = this.selectsArray.filter(item => item.default).map(item => item.id) 
 
      const hasAllItems = (baseArr, haystack) => haystack.every(item => baseArr.includes(item)) 
 
      const hasSameItems = (baseArr, haystack) => hasAllItems(baseArr, haystack) && hasAllItems(haystack, baseArr) 
 
      return hasSameItems(this.selected, defaults) 
 
     }, 
 
     set (value) { 
 
      this.selected = [] 
 

 
      if (value) { 
 
      this.selectsArray.forEach((select) => { 
 
       if (select.default) { 
 
       this.selected.push(select.id) 
 
       } 
 
      }); 
 
      } 
 
     } 
 
     }, // END defaultChecked 
 
     selectAll: { 
 
     get() { 
 
      return this.selected.length === this.selectsArray.length 
 
     }, 
 
     set (value) { 
 
      this.selected = [] 
 

 
      if (value) { 
 
      this.selectsArray.forEach((select) => { 
 
       this.selected.push(select.id) 
 
      }) 
 
      } 
 
     } 
 
     }, // END selectAll 
 
    } 
 
})
<script src="https://cdn.jsdelivr.net/vue/latest/vue.js"></script> 
 

 
<div id="app"> 
 
      
 
<div id="default-settings"> 
 

 
<label class="pref-button"><input type="checkbox" v-model="defaultChecked"><span>Default</span></label> 
 

 
<label class="pref-button"><input type="checkbox" v-model="selectAll"><span>Select All</span></label> 
 

 
</div>  
 
      
 
<label :for="select.id" v-for="select in selectsArray" v-bind:key="select.id"><input :value="select.id" v-model="selected" :id="select.id" :sector="select.id" :class="select.class" :default="select.default" type="checkbox">{{ select.name }}</label> 
 

 
<span>Selected Ids: {{ selected }}</span> 
 
    
 
</div>

関連する問題