1. 程式人生 > >使用Knockout實現全選時遇到的問題

使用Knockout實現全選時遇到的問題

inpu 解決 不知道 因此 取消 nmon 文件 原因 上下文

需求是這樣的:
對每個月份的數據可以實現獨立全選,並不是只有一個全選。


這也是離我開始認識knockout這個東西的時間不到半個月的時間裏,再次接觸它。這樣一個看似比較小的需求,用knockout來做卻花了我不少的時間,原因可能主要還是對它不夠了解,閑話少說,我們來說說遇到的主要問題在哪裏?

1.對於每個對立的checkbox,比較簡單,使用雙向綁定chosenData。

<input type="checkbox" data-bind="checkedValue:$data, checked: $parents[1].chosenData" />

2.對於每個月份的全選,使用click事件

<input type="checkbox" data-bind="click: $parents[0].chosenMonthData, checked: $parents[0].isChosen" />

3.問題來了,由於後端對每月份的每條數據並沒有帶入月份字段,而是獨立出來了,所以每次全選比較簡單,通過concat就能實現,但是取消全選並不能通過月份來過濾,因此這裏需要通過splice來解決,

使用knockout同時綁定checked和click時,checkbox點擊不勾選。所以在綁定的click事件中一定要返回true;

chosenMonthData(data) {
     
if(this.isChosen()) { this.isChosen(false); this.chosenData.splice(this.chosenData.indexOf(data.list[0]), data.list.length) }else { this.isChosen(true); this.chosenData(this.chosenData().concat(data.list)); }
   return true; }

在模板文件中knockout會自動帶入當前所在上下文作用域的參數$data作為chosenMonthData函數的參數,這裏要註意一下,剛開始不知道,帶入參數後,組件js中的所有函數都會跑一遍,

就會找不著北,加上關於knockout的文檔在網上也是比較少的,所有有什麽問題還是去官網找找http://knockoutjs.com/index.html比較好

使用Knockout實現全選時遇到的問題