更新了“可观察数组”下的项目未传播到 UI
Update on Items under ObservableArray NOT propagated to UI
ObservableArrayItem 中的更新未更新 UI我有如下所示的淘汰模型
我的 c# 数据模型如下所示
public class DTO
{
public decimal Amount { get; set; }
public decimal AmountLeft { get; set; }
public TypeDTO[] BType { get; set; }
}
public class TypeDTO
{
public string Description { get; set; }
public decimal Amount { get; set; }
}
这是我的JS,对于初始加载,它可以正常工作
var DetailsViewModel;
$.ajax({
url: "url",
type: "get",
contentType: "application/json",
success: function (result) {
for (i = 0; i < result.BType.length; i++) {
addPercent(result.BType[i], result.Amount);
}
DetailsViewModel = ko.mapping.fromJS(result);
ko.applyBindings(DetailsViewModel, $("#elem-box").get(0));
});
function addPercent(BType, totalAmount) //**adds two new fields to what server sends**
{
BType.Percent = ko.computed(function () {
return ((BType.Amount / totalAmount) * 100).toFixed(2) + '%';
});
BType.Ratio = ko.computed(function () {
return ((BType.Amount / totalAmount) ).toFixed(2);
});
}
在初始 UI 绑定上,它可以完美运行。 后来当我在 JavaScript 中更新DetailsViewModel.BType
数组时,它不会在 UI 中更新。
某些事件传递的触发器 UI 元素的索引对应于 BType 数组
var totalAmount = DetailsViewModel.Amount();
DetailsViewModel.BType()[index].Amount = totalAmount * 10;
DetailsViewModel.AmountLeft = totalAmount - DetailsViewModel.BType()[index].Amount;
addPercent(DetailsViewModel.BType()[index], totalAmount);
对 BType 数组所做的更新都没有在 UI 端更新,也没有在控制台上的 addPercent 函数下进行的更新.log我可以看到模型端的所有更新都成功运行。 为什么数组项更新不传播到 UI?
无法更新单个索引。您需要将整个数组传递给可观察量,以便 KNOCKOUT 可以运行内部更新代码。
var bt = DetailsViewModel.BType();
bt[index].Amount = totalAmount * 10;
DetailsViewModel.BType(bt);
根据Krzyzanowski@Robert所说的话,你需要遵循以下模式:
var typeDTOs = ko.observableArray([]);
var underlyingArray = [];
_.each(result.BType, function(typeDTO) {
typeDTO = addPercent(typeDTO, result.Amount);
underlyingArray.push(typeDTO);
}
typeDTOs(underlyingArray);
或类似的东西(我使用了下划线.js上面只是为了清楚起见)。 你要确保不要推入你的可观察数组;而是推送到底层阵列中。 然后,您可以一次更新所有可观察数组。 如果你不这样做,你最终会为你推入可观察数组的每个项目触发更改事件——通常是不希望的。
关于可观察数组的另一个说明
只是一个侧边栏...如果数组的元素是对象文本,并且您希望 UI 响应文本属性中的更改,则还必须使每个 UI 绑定属性也成为可观察属性。
相关文章:
- 正在将数据主题添加到所有项目
- 动态地改变“”的URL;添加新项目”;链接使用javascript/jquery
- 如何检查管道中未定义的项目
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 学生搜索项目jquery/javascript
- 如何获取不属于我项目的上一页的URL
- Dojo:访问dijit.form.Select中单击的项目
- 角度的项目列表 ng 重复,ng 单击显示全宽描述
- 我需要为我的朋友在这个项目上提供帮助
- 如何从 HTML 查询中删除项目
- 在Meteor项目中安装并包含npm模块后出错
- 当在Ember中点击一个项目时,我如何将一个活动类添加到项目列表中
- 将单击事件添加到附加的项目中
- 通过另一个php应用程序将我的项目推送到Github存储库中
- 在javascript中搜索项目列表的性能
- 如何将本地依赖项添加到npm项目中
- angularjs移除焦点上的活动类并添加到下一个项目
- 为什么react/redux前端项目在package.json中包含生产依赖项
- 将项目发布到叶节点时,没有通知传播到集合节点
- 更新了“可观察数组”下的项目未传播到 UI