2013-04-29 94 views
7

我正在使用durandal /微風與Knockout。validationOptions不能與自定義bindingHandlers一起使用

我正在驗證我的輸入與ko.validation

下面是一個經典:

<input type="text" data-bind="value: myDate, validationOptions: { errorElementClass: 'input-validation-error'}" /> 

.input-validation-error { 
    background-color: #c75b55 !important; 
} 

這一個非常有效:當驗證失敗時,輸入文本框標記爲紅色。

現在我想用一個bindingHandlers代替「簡單」 value結合:

<input type="text" data-bind="dateRW: myDate, validationOptions: { errorElementClass: 'input-validation-error'}" /> 

ko.bindingHandlers.dateRW = { 
    //dateRW --> the 'read-write' version used both for displaying & updating dates 
    init: function (element, valueAccessor, allBindingsAccessor) { 
     var observable = valueAccessor();    
     //handle the field changing 
     ko.utils.registerEventHandler(element, "change", function() { 
      var value = $(element).val(); 
      var dateFormatted = moment.utc(value, "DD/MM/YYYY"); 
      //if (dateFormatted.isValid()) 
      if (dateFormatted) 
       observable(dateFormatted.toDate()) 
      else 
       observable(null); 
     }); 
    }, 
    update: function (element, valueAccessor, allBindingsAccessor) { 
     var value = ko.utils.unwrapObservable(valueAccessor()); 
     var date = (typeof value !== 'undefined') ? moment.utc(value) : null; 
     var dateFormatted = (date != null) ? date.format('DD/MM/YYYY') : ''; 
     $(element).val(dateFormatted);    
    } 
}; 

有了這個實施,驗證工作的,我的意思是ko.validation.group運作良好

var validationErrorsCount = ko.computed(function() { 
    if (typeof itinerary() == 'undefined') return; 
    var validationErrors = ko.validation.group(itinerary()); 
    return validationErrors().length; 
}); 

但輸入文本框不再標記爲紅色。看來'validationOptions'只能與值綁定一起使用。

任何方式來讓我的驗證工作?

謝謝。

回答

13

驗證框架具有值綁定掛鉤,你需要調用

ko.validation.makeBindingHandlerValidatable("dateRW"); 

編輯:

makeBindingHandlerValidatable('value')到:在knockout-validation.js源調用它不是未定義 https://jsfiddle.net/it3xl/n7aqjor9/

+0

你確定你沒有拼寫錯?我得到錯誤'對象#沒有方法'makeBindingHandlerValidatable''。不管怎麼說,還是要謝謝你。 – Bronzato 2013-04-29 10:36:13

+0

它是一個非常新的api功能,你使用的最新版本從https://github.com/Knockout-Contrib/Knockout-Validation – Anders 2013-04-29 10:39:00

+0

看到編輯請 – Anders 2013-04-29 10:41:57

2

展望使value綁定自動驗證。

你可以嘗試添加調用makeBindingHandlerValidatable註冊您的處理程序:

ko.bindingHandlers.dateRW = { 
    //dateRW --> the 'read-write' version used both for displaying & updating dates 
    init: function (element, valueAccessor, allBindingsAccessor) { 
     ... 
    }, 
    update: function (element, valueAccessor, allBindingsAccessor) { 
     ... 
    } 
}; 

ko.validation.makeBindingHandlerValidatable('dataRW'); 
0

validationMessage一個空的元件結合。

我不想讓文本框標記爲紅色。
有時可以使用validationMessage綁定的附加空標記(跨度)。

<input data-bind="datepickerCustom: myDate"/> 
<span data-bind="validationMessage: myDate" class="validationMessage"></span> 
相關問題