2013-03-10 71 views
2

我在尋找一個淘汰賽驗證插件和我偶然發現knockout.validation看起來非常有前途的,但是,它有一個致命的缺點..Knockout.Validation不可用,任何替代方法?或變通辦法?

一旦你創建了一個ko.validatedObservable({名稱:FOO} )您無法將新對象分配給該可觀察對象。

例如:在我的視圖模型中,我實例化一個驗證的observable。

var item = new ko.validatedObservable(new Tag({})); 

我就能夠調用:

item().isValid(); //Returns false in this case because Tag is empty 

標記看起來像這樣

Model.Tag = function (data) { 
    var 
     Id = ko.observable(data.Id), 
     Name = ko.observable(data.Name).extend({ required: true, maxLength: 64 }), 
     Description = ko.observable(data.Description).extend({ required: true, maxLength: 512 }); 

    return { 
     Id: Id, 
     Name: Name, 
     Description: Description 
    }; 
}; 

的問題是,如果我想從服務器獲取一個新的標籤,然後修改標籤..

 $.ajax({ 
      url: API + "/" + id, 
      type: 'GET', 
      dataType: 'json', 
      timeout: Timeout, 
      statusCode: { 
       200: function(response) { item(response); }, //Here is where the bug is! 
       404: ItemNotFound 
      }, 
      error: function() { 
       Item(new Type({})); 
      } 
     }); 

項目now contains從服務器的價值,但是,當我運行

item().isValid(); //False is returned 

這被列爲GitHub的項目https://github.com/ericmbarnard/Knockout-Validation/issues?state=open錯誤#209。

有沒有人知道一個優雅的工作?還是另一個可以實現這個目標的插件?

回答

2

我不知道它有多優雅,也許這不是最好的解決方案(或者根本不是解決方案),所以使用它需要您自擔風險。

但是你可以重寫ko.validatedObservable有「固定」版本:

ko.validatedObservable = function (initialValue) { 
    if (!ko.validation.utils.isObject(initialValue)) { 
      return ko.observable(initialValue).extend({ validatable: true }); 
    } 

    var obsv = ko.observable(initialValue); 
    obsv.lastErrors = ko.observable(ko.validation.group(initialValue));  
    obsv.subscribe(function(newValue){    
     obsv.lastErrors(ko.validation.group(newValue)); 
    }); 
    obsv.errors = function() {   
     return obsv.lastErrors()(); 
    }; 
    obsv.isValid = ko.computed(function() { 
     return obsv.errors().length === 0; 
    }); 

    return obsv; 
}; 

我修復存儲ko.validation.group調用的結果,並重新計算當底層obsv觀察到的變化和我也改變了original errors property使用lastErrors屬性。

我已更新github issue中的示例,您在此演示中檢查JSFiddle

+0

@nemsev非常感謝你的迴應,這就解決了這個問題。我的單元現在全部通過測試。你知道更新git-hub上的項目是什麼嗎?我想我可以在這裏提供一個錯誤解決方案的鏈接。再次感謝! – mcottingham 2013-03-10 17:23:19

+0

對此有何改進?如果初始值未定義,那麼在聲明validatedObservable時它不起作用。我已經修改它來支持這種情況,但我不確定是否有更好的選擇? https://gist.github.com/thj-dk/1f243519bfc2954bca60 – 2014-08-11 13:50:43

+0

@TommyJakobsen看來這部分插件沒有改變:https://github.com/Knockout-Contrib/Knockout-Validation/blob/98a25714560e321779cbe6779d00ee4343871add /Src/ko.extensions.js。所以目前這是解決方案。但是,您可以在Github上使用改進的修復程序和此問題的描述創建問題/請求。 – nemesv 2014-08-12 06:57:48

相關問題