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());

違いについては...ここでは、期待どおりにコンテキストcalendarViewModelを設定するa の実際のインスタンスを作成しています。this

また、クロージャーを使用して、 内の独自のメンバーに正しくアクセスできるようにしますcomputed

于 2013-04-14T00:46:16.613 に答える