淘汰赛计算未使用可观察数组进行更新
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 的位置,这可以帮助您帮助我;)
再次感谢
【讨论】:
以上是关于淘汰赛计算未使用可观察数组进行更新的主要内容,如果未能解决你的问题,请参考以下文章