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

需求是這樣的:
    對每月份的數據能夠實現獨立全選,並非只有一個全選。html


這也是離我開始認識knockout這個東西的時間不到半個月的時間裏,再次接觸它。這樣一個看似比較小的需求,用knockout來作卻花了我很多的時間,緣由可能主要仍是對它不夠了解,閒話少說,咱們來講說遇到的主要問題在哪裏?後端

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

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

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

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

3.問題來了,因爲後端對每個月份的每條數據並無帶入月份字段,而是獨立出來了,因此每次全選比較簡單,經過concat就能實現,可是取消全選並不能經過月份來過濾,所以這裏須要經過splice來解決,spa

使用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中的全部函數都會跑一遍,code

就會找不着北,加上關於knockout的文檔在網上也是比較少的,全部有什麼問題仍是去官網找找http://knockoutjs.com/index.html比較好htm

相關文章
相關標籤/搜索