2014-08-27 2 views
2

У меня есть ko.observable обработки финикового объекта JS так:Knockout.js - Как изменить наблюдаемый объект JS Date?

vm.date = ko.observable(new Date()); 

Мне нужна простая функция, которая может увеличить или уменьшить дату на е дни. Вроде так:

vm.changeDay = function(x) { 
    // I want this function to increase or decrease date by x days each time it is called. 
}; 

Проблема с моими текущими реализациями заключалась в том, что наблюдаемый vm.date не обновлялся в моем представлении. Вероятно, это связано с тем, что объект JS Date представляет собой нечто большее, чем простое строение, и его нужно разбить и собрать определенным образом, чтобы можно было наблюдать. Я пробовал использовать ko.computed для этого, но не удалось.

См jsfiddle для простого обзора проблемы: http://jsfiddle.net/tp6jb4x1/

+1

Не уверен, что вы можете это сделать: data-bind = "click: changeDay (-1)", обновили свою скрипту для работы: http://jsfiddle.net/tp6jb4x1/1/ –

+0

data-bind = "click: function() {changeDay (-1);} " – DaveB

ответ

0

Логика дата была немного неочевидно, поэтому я обновил вашу скрипку:

http://jsfiddle.net/tp6jb4x1/3

Соответствующая часть:

... data-bind="click: changeDay.bind($data, 1)" ... 

self.changeDay = function(dayDelta) { 
    var d = this.date(); 
    d.setDate(d.getDate() + dayDelta); 
    this.date(new Date(d.getTime())); 
}; 

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

+1

ПРИМЕЧАНИЕ. Я настоятельно рекомендую просто обрезку и использование момента js для логики даты. Очень хорошая библиотека. – Milimetric

Смежные вопросы