javascript - knockoutjs,可观察对象相互更新

标签 javascript knockout.js

我有包含 3 个字段的 View 模型

dateStart = ko.observable();
dateEnd = ko.observable();
days = ko.observable();

假设选择了 startDate,则每当选择 endDate 时,天数字段都需要更新(天数 = endDate - startDate)。

此外,当更新天数字段时,我需要计算结束日期(结束日期 = 开始日期 + 天数)。

如何使用 knockoutjs 来完成此操作?

谢谢!

我已经尝试过了 http://jsfiddle.net/NfG4C/6/ ,但是我的js总是抛出太多递归异常。

最佳答案

据我了解,你基本上需要两件事。

  1. 您希望在有人选择时计算“天”字段 “endDate” [假设他们当然选择了“startDate”]
  2. 每当有人更改“endDate”字段时,您都希望重新计算“endDate”字段 “天”字段

解决这个问题的一种方法是使用“可写”计算的 Observable [http://knockoutjs.com/documentation/computedObservables.html] 。请通过链接了解详细信息,但一般而言,“可写计算可观察量”是指其值基于某些“其他”可观察量“计算”的东西,反之亦然。

我冒昧地修改了你的 fiddle 并将“天”更改为计算的可观察值。请看一下:http://jsfiddle.net/dJQnu/5/

this.days = ko.computed({
    read: function () {
        //debugger;
        // here we simply need to calculate the days as => (days = endDate - startDate)
        if (that.dateStart() && that.dateEnd()) {
            var vacDayCounter = 0;
            for (var curDate = new Date(that.dateStart()); curDate <= that.dateEnd(); curDate = curDate.addDays(1)) {
                if (isDateCountsAsVacation(curDate)) {
                    vacDayCounter++;
                }
            }
            //that.days(vacDayCounter);
            return vacDayCounter;
        }
    },
    write: function (newDays) {
        if (newDays && !isNaN(newDays) && that.dateStart()) {
            var tmpEndDate = new Date(that.dateStart())
            appliedDays = 0;
            while (appliedDays < newDays) {
                if (isDateCountsAsVacation(tmpEndDate)) {
                    appliedDays++;
                }
                tmpEndDate = tmpEndDate.addDays(1);
            }
            if (tmpEndDate) {
                that.dateEnd(tmpEndDate);
            }
        }
    }
});

如果您注意到,我只是在读写部分重用了您的代码(逻辑)。在读取期间,我们正在“计算”可观察值本身的值,在本例中为“天”,而在写入期间(只要用户更改实际的“天”输入值就会触发),我们正在重新计算“dateEnd”字段。

如果您有任何其他问题,请告诉我。

希望这有帮助。

谢谢。

关于javascript - knockoutjs,可观察对象相互更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15459951/

相关文章:

javascript - 如果值大于(在 foreach 上),则 knockout JS 删除选项

javascript - Mongoose 从 html datepicker 中查找 2 个日期之间的结果

javascript - 单页 Angular 应用的自动化前端性能测试

javascript - knockout js : what is the proper way to trade out an image for text

knockout.js - 找出哪个可观察到的依赖变化触发了计算评估;转储上下文

javascript - 使用 window.open() 并为新窗口中的 View 传递 knockoutjs ViewModel

javascript - AngularJS:mdDatepicker 休息一天

javascript - trim 和清理谷歌脚本

javascript - jQuery 动画数字计数器从零到 PHP 函数中返回的某个数字

knockout.js - 检查knockoutjs是否加载