挖空样式绑定在修改基础数据时不更新
Knockout style binding not updating on modification of underlying data
我有一个使用模板显示的对象数组。 该模板包含一个按钮,该按钮根据该对象是否存在于另一个数组中来更改颜色:
网页代码:
<button type="button" class="btn btn-default productButton" data-bind="click: $root.selectForCompare, style: { color: $root.isSelectedForCompare($data) ? 'blue' : 'black' }">
<span class="glyphicon glyphicon-duplicate"></span><br />Compare
</button>
查看型号代码:
self.isSelectedForCompare = function (product) {
return indexOfProduct(self.compareItems(), product) !== -1;
};
self.selectForCompare = function (product) {
var i = indexOfProduct(self.compareItems(), product);
if(i === -1){
self.compareItems().push(product);
} else {
self.compareItems().splice(i,1);
}
};
如果用户单击该按钮,则将为第二个数组添加或删除该项(取决于该数组中是否已存在该项)。
当页面呈现时,它会为每个对象正确调用 isSelectedForCompare(product)
函数,从而显示正确的颜色。 问题是,当用户单击按钮(颜色应该改变)时,不会再次调用isSelectedForCompare
来计算新颜色,并且按钮不会改变。
单击该按钮会修改用于计算isSelectedForCompare(product)
的数组,但 Knockout 似乎没有看到这是更新样式绑定的原因。
当我发布这个消息时,我意识到了我的错误:我不是在observableArray上调用数组修改函数,而是在评估的javascript数组上调用:
self.compareItems().push(product)
self.compareItems().splice(i,1);
应该是:
self.compareItems.push(product)
self.compareItems.splice(i,1);
这并没有给框架一个机会通知任何observableArray的订阅者数据已经改变。我已经修复了我的代码,它现在可以正常工作。
相关文章:
- 平均值:无法将数据更新到数据库
- d3在数据更新时错误地附加了dom元素
- 使用角度传递的数据更新模态
- jQuery使用XML数据更新UL列表
- ng表DOM未使用数据更新进行更新
- 在线/离线数据更新移动最佳实践
- 使用 预测 API 数据更新的 HTML 模板
- JQuery 数据表列数据更新工作太慢
- 使用Plotly中的新数据更新图形的高性能方法
- 使用新数据更新 D3 饼图.json
- jQuery - 使用相同的数据更新 2 个或多个表单字段
- 如何在数据更新时更新可重用的 d3.js 图形
- 组合框/下拉框在数据更新后未更新
- 在 JavaScript 中的数据更新后,我的 DOM 对象不会更新
- 如何使用来自外部源的数据更新 ng 模型
- 主干.js:使用不同的数据更新集合
- 对数据库进行 AJAX 编辑时,我是否应该立即使用新数据更新接口
- 计划脚本以使用外部数据更新数据库
- 使用从 MongoDB 获取的新数据更新对象属性
- 如何每 n 分钟使用数据更新一次 Web 应用程序