淘汰赛可观察订阅:超过最大调用堆栈

恩博克曼斯

我正在尝试编写一个程序,该程序可以自动将两个单位相互转换,并用转换后的值填充另一个单位,即月薪到时薪的转换器。

为了更好地展示我正在尝试做的事情,这里是我的淘汰赛模型的精简版:

class Model {
    hourlyRate: KnockoutObservable<number>;
    monthlyRate: KnockoutObservable<number>;
    hoursPerWeek: KnockoutObservable<number>;

    constructor() {
        this.hourlyRate = ko.observable<number>();
        this.monthlyRate = ko.observable<number>();
        this.hoursPerWeek = ko.observable<number>(40);

        this.monthlyRate.subscribe((newValue: number) => {
            const hourlyRate = newValue * 3 / 13 / this.hoursPerWeek();
            this.hourlyRate(hourlyRate);
        });

        this.hourlyRate.subscribe((newValue: number) => {
            const monthlyRate = newValue * this.hoursPerWeek() * 13 / 3;
            this.monthlyRate(monthlyRate);
        });
    }
}

但是,这会导致调用堆栈超出异常(hourlyRate 更新monthlyRate,然后更新hourlyRate,然后更新monthlyRate...无限期)。

我如何防止这种情况发生?

射线

我认为这将是使用可写计算 observables的好地方

这是一个片段(抱歉,我不精通打字稿):

var viewModel = function(){
  this.hourlyRate = ko.observable();
  this.hoursPerWeek = ko.observable(40);
  this.monthlyRate = ko.pureComputed({
    read: function(){
      return this.hourlyRate() * this.hoursPerWeek() *13/3;
    },
    write: function(newValue){
      const hourlyRate = newValue * 3 / 13 / this.hoursPerWeek();
      this.hourlyRate(hourlyRate);
    },
    owner: this
  });
};

ko.applyBindings(new viewModel());
label {
  display: inline-block;
  width: 140px;
  text-align: right;
}

.block {
  padding: 5px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>

<div class="block">
    <label>Hourly Rate:</label>
    <input type="number" data-bind="value: hourlyRate">
</div>
<div class="block">
    <label>Monthly Rate:</label>
    <input type="number" data-bind="value: monthlyRate">
</div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

淘汰赛可观察的订阅多次触发

来自分类Dev

淘汰赛订阅可观察的复杂对象的任何更改

来自分类Dev

淘汰赛可观察的订阅多次触发

来自分类Dev

淘汰赛:链接可观察的数组

来自分类Dev

淘汰赛:更改可观察值

来自分类Dev

是否让淘汰赛计算对象订阅不在初始执行路径中的可观察对象?

来自分类Dev

用FuelUX树订阅可观察到自定义Jquery事件的淘汰赛

来自分类Dev

淘汰赛订阅/事件类型系统没有可观察的?

来自分类Dev

是否让淘汰赛计算对象订阅不在初始执行路径中的可观察对象?

来自分类Dev

淘汰赛:可以在没有参数的情况下调用可观察的扩展程序吗?

来自分类Dev

淘汰赛:Ajax调用后无法映射计算的可观察物

来自分类Dev

淘汰赛:找出计算出的可观察触发

来自分类Dev

淘汰赛计算可观察到的参数

来自分类Dev

淘汰赛可观察到的表演

来自分类Dev

淘汰赛移除率从可观察到的限制

来自分类Dev

无法在淘汰赛js中获得可观察的数据

来自分类Dev

淘汰赛可观察到的最新价值

来自分类Dev

带有字符的淘汰赛追加可观察对象

来自分类Dev

可观察到淘汰赛更新

来自分类Dev

淘汰赛如何设置可观察儿童的价值

来自分类Dev

淘汰赛JS和可观察的单选按钮

来自分类Dev

在淘汰赛中对可观察的列表进行排序

来自分类Dev

淘汰赛:可观察输入数组的 observableArray

来自分类Dev

分配时淘汰赛可观察数组被覆盖

来自分类Dev

浏览器之间可观察到的淘汰赛共享-仅在本地更改值时订阅

来自分类Dev

在淘汰赛可观察阵列订阅功能中,您可以确定添加或删除了哪些元素?

来自分类Dev

最大调用堆栈大小超过popstate

来自分类Dev

超过最大调用堆栈大小

来自分类Dev

使用ko.mapping.fromJS更新异步ajax调用后可观察到的淘汰赛

Related 相关文章

  1. 1

    淘汰赛可观察的订阅多次触发

  2. 2

    淘汰赛订阅可观察的复杂对象的任何更改

  3. 3

    淘汰赛可观察的订阅多次触发

  4. 4

    淘汰赛:链接可观察的数组

  5. 5

    淘汰赛:更改可观察值

  6. 6

    是否让淘汰赛计算对象订阅不在初始执行路径中的可观察对象?

  7. 7

    用FuelUX树订阅可观察到自定义Jquery事件的淘汰赛

  8. 8

    淘汰赛订阅/事件类型系统没有可观察的?

  9. 9

    是否让淘汰赛计算对象订阅不在初始执行路径中的可观察对象?

  10. 10

    淘汰赛:可以在没有参数的情况下调用可观察的扩展程序吗?

  11. 11

    淘汰赛:Ajax调用后无法映射计算的可观察物

  12. 12

    淘汰赛:找出计算出的可观察触发

  13. 13

    淘汰赛计算可观察到的参数

  14. 14

    淘汰赛可观察到的表演

  15. 15

    淘汰赛移除率从可观察到的限制

  16. 16

    无法在淘汰赛js中获得可观察的数据

  17. 17

    淘汰赛可观察到的最新价值

  18. 18

    带有字符的淘汰赛追加可观察对象

  19. 19

    可观察到淘汰赛更新

  20. 20

    淘汰赛如何设置可观察儿童的价值

  21. 21

    淘汰赛JS和可观察的单选按钮

  22. 22

    在淘汰赛中对可观察的列表进行排序

  23. 23

    淘汰赛:可观察输入数组的 observableArray

  24. 24

    分配时淘汰赛可观察数组被覆盖

  25. 25

    浏览器之间可观察到的淘汰赛共享-仅在本地更改值时订阅

  26. 26

    在淘汰赛可观察阵列订阅功能中,您可以确定添加或删除了哪些元素?

  27. 27

    最大调用堆栈大小超过popstate

  28. 28

    超过最大调用堆栈大小

  29. 29

    使用ko.mapping.fromJS更新异步ajax调用后可观察到的淘汰赛

热门标签

归档