Проблема привязки даты в KnockoutJS при использовании jQuery datepicker - PullRequest
1 голос
/ 04 марта 2012

У меня проблема с привязкой даты к объекту в моей модели просмотра.У меня есть дата, которую я получаю с сервера.

 var viewModel = {
    profile : ko.mapping.fromJS(initialData),

Я связываю свойство с текстовым полем.

<input data-bind="datepicker: profile.Birthdate()" />

Я использую пользовательскую привязку, которую я нашел здесь: http://jsfiddle.net/rniemeyer/NAgNV/

    ko.bindingHandlers.datepicker = { 
init: function(element, valueAccessor, allBindingsAccessor) { 
    //initialize datepicker with some optional options 
    var options = allBindingsAccessor().datepickerOptions || {}; 
    $(element).datepicker(options); 

    //handle the field changing 
    ko.utils.registerEventHandler(element, "change", function () { 
        var observable = valueAccessor(); 
        ko.observable($(element).datepicker("getDate")); 
        $(element).blur();
    }); 

    //handle disposal (if KO removes by the template binding) 
    ko.utils.domNodeDisposal.addDisposeCallback(element, function() { 
        $(element).datepicker("destroy"); 
    }); 

}, 
update: function(element, valueAccessor) { 
    var value = ko.utils.unwrapObservable(valueAccessor()), 
        current = $(element).datepicker("getDate"); 

    if(value != null)
    {
        if(value.toString()[0] = "/")
            value = new Date(parseInt(value.toString().substr(6)));
    } 

    if (value - current !== 0) { 
        $(element).datepicker("setDate", value); 
    }
} 

};

Я добавил if (value.toString () [0] = "/") для форматирования даты, отображаемой в текстовом поле.

Кажется, этоработать хорошо, кроме случаев, когда я пытаюсь сохранить объект и добавить его обратно на сервер.Я добавил предупреждение для проверки, и перед отправкой объекта на сервер изменения даты не происходят.

 save : function(){
        alert(this.profile.Birthdate);

Есть идеи, что я делаю неправильно?

Спасибо заваше время.

Ответы [ 2 ]

0 голосов
/ 07 марта 2012

Я подозреваю, что это связано с тем, как вы связываете это.Когда вы делаете profile.Birthdate (), вы передаете фактическое значение, а не наблюдаемое.Поэтому, пожалуйста, попробуйте изменить

<input data-bind="datepicker: profile.Birthdate()" />

на

<input data-bind="datepicker: profile.Birthdate" />
0 голосов
/ 04 марта 2012

В следующей строке убедитесь, что вы используете == вместо одного = в вашем условном выражении.

if (value.toString () [0] == "/")

...