淘汰赛计算未使用可观察数组进行更新

Posted

技术标签:

【中文标题】淘汰赛计算未使用可观察数组进行更新【英文标题】:Knockout computed not updating using observable array 【发布时间】:2014-12-09 17:47:31 【问题描述】:

我有以下 ViewModel:

function vm(model) 

    var self = this;

    var Create = function (data) 
        var order = ko.utils.extend(data, );
        order.Price = ko.observable(data.Price);
        return order;
    

    self.orders = ko.mapping.fromJS(model, 
        create: function (options) 
            return Create(options.data);
        
    );

    self.FirstPrice = ko.pureComputed(function () 
        return parseFloat(self.orders()[0].Price());
    );

页面加载时“FirstPrice”正常更新,但更改“orders”数组第一行的Price后,“FirstPrice”仍然是页面加载后的第一个值。

缺少什么?

* 我删除了一些代码行以简化示例

谢谢

【问题讨论】:

我相信self.orders 需要是一个可观察的数组。 是的。 ko.mapping.fromJS 将对象转换为可观察数组。我在 MVC 中使用它;) 您如何更改可观察到的价格? 两件事 1) 您是否调试了 purecomputed 属性并检查代码是否被调用?纯计算和计算的 observables 是有区别的。 2)如果它命中计算代码,self.orders 集合是否具有正确/更新的数据。 3) 您是使用代码还是通过 UI 更改价格值?如果是通过代码,请确保您不要执行类似 .price = xyz 的操作,因为它是可观察的。其中一些对你来说可能很明显,但仅供我参考。 嗨。 1)是的,我检查了一个警报,它只在页面加载后被调用。我也用相同的结果测试了计算的 observable。 2)页面加载后,数据正​​确更新。 3) 我正在通过 UI 更改价格值。感谢您的宝贵时间 【参考方案1】:

请参阅documentation for observableArray。特别是本节:

关键点:一个 observableArray 跟踪哪些对象是 in 数组, 不是那些对象的状态

【讨论】:

谢谢帕特里克,我在这个文本参考中看到了一些其他问题,但这不适用于我的情况,因为 Price 属性也是一个可观察的。我的代码在页面加载后工作。 我阅读了文档并且有“......当然,如果你愿意,你可以让这些属性可观察”【参考方案2】:

我发现了问题。问题是我在绑定输入中使用了输入掩码。

有一个解决方法: https://github.com/RobinHerbots/jquery.inputmask/wiki/HOWTO:-Integration-with-Knockoutjs

抱歉,我没有将 html 放在我在问题中使用 observable 的位置,这可以帮助您帮助我;)

再次感谢

【讨论】:

以上是关于淘汰赛计算未使用可观察数组进行更新的主要内容,如果未能解决你的问题,请参考以下文章

淘汰:为什么我的计算函数会自动将项目推送到我的可观察数组中?

侧面可观察数组中可观察数组的变化不更新淘汰赛js中的UI

UI未使用ko.utils.arrayFilter进行更新

使用敲除计算函数更新文本

淘汰赛可观察数组

淘汰赛标题不更新可观察