2013-04-02 80 views
1

我正在創建一個TODO列表web應用程序,我有一個關於如何保存列表內容的問題。就像任何文字處理器一樣,我想讓用戶在保存期間修改數據。如果允許用戶在保存期間修改內容,如何捕獲要保存的內容?

我可以使用一個布爾變量來表明某些東西被用戶改變了,也就是說。如果某些內容發生更改,則爲TRUE,否則爲FALSE。也許,這個標誌也用來向用戶顯示一些數據未保存。當用戶按下Ctrl + S保存數據時,我的應用程序調用一個函數,然後獲取列表中的當前數據並開始將其保存到數據庫中。最後,變量變爲false。這似乎很簡單,但這種方法存在明顯的缺陷。例如。

  1. 用戶更改數據。布爾變量變爲TRUE。
  2. 用戶按下Ctrl + S。
  3. 函數被調用並且它檢索當前數據並開始保存它。
  4. 用戶在保存期間更改更多數據。
  5. 函數完成保存並將變量設置爲FALSE。

即使有來自步驟4的未保存的數據,也很容易看到該標誌被設置爲FALSE。字處理器/文本編輯器如何處理這個問題?他們只是在保存期間禁用輸入,但它很快,我沒有看到它?

回答

1

在瀏覽器中有一個revision字段。另外,還有一個saved_revision字段。當文檔保存開始時,您的代碼會記住當前的revision,並且保存完成後,它會將saved_revision顛倒爲該值。每當用戶改變一些東西時,revision遞增1。要檢查是否保存了所有更改,請檢查是否revision == saved_revision。這樣的事情:

var revision = 0 
var saved_revision = 0 

function handle_keypress() { 
    revision++ 
    update_document_saved_display() 
    /* ... */ 
} 

function save() { 
    var saving_rev = revision 
    upload_version(serializeDocument(), function(status) { 
    if (status === 'ok') { 
     saved_revision = saving_rev 
     update_document_saved_display() 
    } 
    }) 
} 
+0

謝謝,我認爲這可行。你碰巧知道這是否是防止我描述的問題的常用方法?只是好奇。 – CookieMonster

+0

@CookieMonster:我不知道。 – thejh