2014-01-28 99 views
0

我有一個視圖,顯示員工信息。在這個視圖中,我有一個複選框,例如:Recieve Daily Email。當上複選框用戶點擊我需要執行一個AJAX功能樣的驗證,以檢查用戶是否可以更改設置:更改viewmodel屬性前執行功能

If result is true: allow knockout to change the ViewModel Property 
If result is false: prevent knockout to change the ViewModel Property 

我做了一個簡單的demo來證明我的問題。我假設我的AJAX功能'return false。嘗試單擊複選框,然後單擊該按鈕以檢查ViewModel值,雖然沒有選中(因爲return false),但它仍然是true。

有何建議?

回答

0

我不確定你希望用戶在檢查時看到的確切行爲,但不允許,但是這樣的好方法是使布爾值可觀察並手動訂閱它以更改。

當您創建Person它可能是這樣的:

function Person(name, receiveMail) { 
    this.name = name; 
    this.receiveMail = ko.observable(receiveMail); 

    this.receiveMail.subscribe(function() { 
     //do AJAX here 
     setTimeout(function() { 
      this.receiveMail(false); 
     }.bind(this), 1000); 
    }, this); 
} 

所以,我們做receiveMail可觀察到的,並訂閱它在視圖模式轉變。當t改變時,您可以進行AJAX調用,然後進行相應的響應。

下面是一個說明這與一條錯誤消息,小提琴:http://jsfiddle.net/rniemeyer/pMmvf/

+0

但是當你改變觀察的''receiveMail'這setTimeout'「會再次觸發'subscribe'功能,對不對? –

+0

在當前的例子中,它會一次觸發它。用一個額外的標誌來管理這個很容易:http://jsfiddle.net/rniemeyer/eKdxZ/。如果使用AJAX調用,則可以在發出AJAX請求(以防止潛在的多個請求)之前將該標誌設置爲true,然後在AJAX調用失敗時將其清除。 –