2012-03-19 88 views
0

我想實現一個項目列表,每個項目都有一個複選框來選擇項目。在列表頂部,有2個單選按鈕可以檢查全部或沒有項目。但是,當我更新選定列表時,複選框未被選中。我在這裏有一個小提琴來說明問題: http://jsfiddle.net/hawaii/VcZBf/2/在項目列表中選擇全部並且沒有項目,在knockoutjs中

請問你們能幫我解決這個問題嗎?

謝謝

+0

爲什麼這樣,怪異...'viewModel.checkedPeople(新的Array());' – elclanrs 2012-03-19 05:09:40

+0

是我不好,我只是無意中與我的JavaScript智能感知 – tuanvt 2012-03-19 09:26:16

回答

0

我你的結構有點。我不認爲peoplecheckedPeople真的是淘汰賽。如果你確實想要checkedPeople,它可能只是一個只讀的計算可觀察值。

我給最初的人添加了一個IsChecked字段(都是假的)。然後我改變了複選框以映射到那個。最後,我使用arrayForEach單選按鈕更改所有IsChecked字段。

現在,單選按鈕GUI並不是很直觀。你可以採取兩種appraoches:

  1. 讓他們常規按鈕(推薦)
  2. 讓他們來檢查,並通過自動取消數據綁定的檢查,以一計算allChecked標誌模型。這意味着即使您逐個選中複選框,它們也會自動檢查。

我也拿出你的日誌。我假設這是調試,但如果需要,您可以重新添加它。

+0

你好做到了有,感謝您的幫助,但是,問題是我正在做這個服務器端分頁,我需要允許用戶選擇所有項目(這不僅僅是客戶端的人),因此我持有檢查在一個ID陣列中的人) – tuanvt 2012-03-19 09:23:39

1

UPDATED 所以你想做一個「checkAll(本頁)」的實現。

爲了保持對從一個分頁事件到下一個分頁事件的檢查更改,我會在分頁事件期間將網格中當前檢查的項目推送到服務器,或者將檢查/取消選中操作保持回DB右側在每個事件之後。它是一種廉價的電話,你是不是在失去了檢查的項目的風險,因爲用戶打backspace key accidentally.

不發送支票在每個分頁操作的服務器...

  • 您即使這些記錄所代表的模板被分頁到另一個頁面,也會將檢查與列表分開存儲。 (請務必在下一頁時只更新觀察對象陣列)
  • 然後,重要的是,在每個頁面事件中,您需要將檢查重新應用到顯示的項目的網格上。

  • 最後,爲了避免檢查標記代表它們的檢查狀態(您單擊全選,而您沒有看到它們被檢查)。這是因爲你有checked:$parent.checkedPeople。這將永遠不會工作,因爲checkedPeople是一個數組,而不是布爾值。我改變了這個功能,詢問這個人的身份證是否在檢查人民陣列

無論如何..它是:http://jsfiddle.net/VcZBf/24/

它是一個粗略的概念。

WITH發送當前檢查服務器上的每個分頁操作

  • 每個對象現在將有一個「器isChecked」觀測。
  • 在每個分頁事件中,當前頁面的複選標記都會保存到數據庫服務器端。
  • 然後,如果您返回到帶有選中標記的頁面,它們會爲您顯示備份。

更平滑。從以前的答案

參考: http://en.wikipedia.org/wiki/Principle_of_least_astonishment

+0

gmail檢查所有是我真正喜歡實現,檢查所有將允許我先選擇頁面上的所有項目,然後它會顯示一條消息,說明我是否想選擇郵箱上的所有項目 – tuanvt 2012-03-20 01:30:52

+0

我更新了我的答案以更好地描述2個解決方案。 – 2012-03-23 11:46:52

+0

你好布蘭登,謝謝你的努力,這是一個非常有前途的解決方案。然而,我決定去kogrid,在那裏我可以做我自己的自定義模板來實現我想要的。 – tuanvt 2012-03-26 03:34:13