1

我正在使用 knockout.js 和 moment.js 来计算给定月份的一些值。以下代码按预期工作:

var calendarViewModel = {
    selectedMonth: ko.observable(moment().format("M")),
    daysInMonth: ko.observable(moment().month(3).daysInMonth())
};

ko.applyBindings(calendarViewModel);

selectedMonth 的返回值为“4”,daysInMonth 的返回值为“30”。

但我想做的是根据 selectedMonth 的当前值(会改变)计算 daysInMonth 的值。我能想到的最好的代码是这样的:

var calendarViewModel = {
    selectedMonth: ko.observable(moment().format("M")),
    daysInMonth: ko.observable(moment().month(calendarViewModel.selectedMonth() - 1).daysInMonth())
};

ko.applyBindings(calendarViewModel);

我进入Uncaught TypeError: Cannot read property 'selectedMonth' of undefined控制台。我无法理解的是如何在这种情况下正确引用 selectedMonth 。如果我在 viewModel 之外的其他一些通用变量中创建 selectedMonth ,那么我所做的一切都可以正常工作。

我很确定这与我对 JavaScript 对象的(较差的)理解有关,与库本身无关。

4

1 回答 1

0

您需要为此创建一个计算

var calendarViewModel = function(){
    var self = this;
    self.selectedMonth = ko.observable(moment().format("M"));
    self.daysInMonth = ko.computed(function(){
        var selectedMonth = self.selectedMonths();
        return moment().month(selectedMonth - 1).daysInMonth();
    });
};

ko.applyBindings(new calendarViewModel());

至于区别......这里我们正在创建一个实际的 a 实例,calendarViewModel它将按照您期望的方式设置this上下文。

它还使用闭包来确保您可以在computed.

于 2013-04-14T00:46:16.613 回答