gpt4 book ai didi

knockout.js - Knockout 的映射破坏了可观察的数组

转载 作者:行者123 更新时间:2023-12-04 22:23:51 28 4
gpt4 key购买 nike

我在使用 Knockout 的映射插件时遇到了一个奇怪的问题。

如果我通过映射填充一个 observable 数组,我将无法迭代该数组或获取其长度,即使 UI 已正确更新,该数组似乎也是空的。

你可以在这里找到一个有效的 jsFiddle:http://jsfiddle.net/VsbsC/

这是 HTML 标记:

<p><input data-bind="click: load" type="button" value="Load" /></p>
<p><input data-bind="click: check" type="button" value="Check" /></p>
<table>
<tbody data-bind="foreach: items">
<tr>
<td data-bind="text: name"></td>
<td data-bind="text: value"></td>
</tr>
</tbody>
</table>
<p data-bind="text: total"></p>

这是 JavaScript 代码:

var ViewModel = function () {
var self = this;
self.items = ko.observableArray();
self.load = function () {
self.items([
{ "name": "joey", "value": 1 },
{ "name": "anne", "value": 2 },
{ "name": "paul", "value": 3 },
{ "name": "mike", "value": 4 }
]);
};
self.check = function () {
alert(self.items().length);
};
self.total = ko.computed(function () {
var total = 0;
for (var i = 0; i < self.items().length; i++) {
total += self.items()[i].value;
}
return total;
});
};
var viewModel = new ViewModel();
ko.applyBindings(viewModel);

当我点击加载按钮时,记录和总数都正确显示,当我点击检查按钮时,我得到正确的项目编号。

但是,如果我改变

self.items([
{ "name": "joey", "value": 1 },
{ "name": "anne", "value": 2 },
{ "name": "paul", "value": 3 },
{ "name": "mike", "value": 4 }
]);



self.items(ko.mapping.fromJS([
{ "name": "joey", "value": 1 },
{ "name": "anne", "value": 2 },
{ "name": "paul", "value": 3 },
{ "name": "mike", "value": 4 }
]));

UI 仍然可以正确呈现,但总数显示为零,单击 Check 也会产生零,并且 console.info -ing self.items 会产生一个空数组。

这怎么可能?我已经无数次重新阅读教程,我无法理解我做错了什么。

附言我需要通过映射插件填充可观察数组,因为在真实页面中,值来自 AJAX 请求。

最佳答案

您看到的问题是基于这样一个事实:如果给定数组,映射插件将创建一个 observableArray。因此,您将 self.items observableArray 的值设置为等于 observableArray(而不仅仅是数组)。所以,它被包裹了额外的时间。

这是一种方法:

var ViewModel = function () {
var self = this;
self.items = ko.mapping.fromJS([]);
self.load = function () {
ko.mapping.fromJS([
{ "name": "joey", "value": 1 },
{ "name": "anne", "value": 2 },
{ "name": "paul", "value": 3 },
{ "name": "mike", "value": 4 }
], self.items);
};
self.check = function () {
alert(self.items().length);
};
self.total = ko.computed(function () {
var total = 0, items = self.items();
for (var i = 0; i < items.length; i++) {
total += items[i].value();
}
return total;
});
};
var viewModel = new ViewModel();
ko.applyBindings(viewModel);

因此,您使用映射插件初始化原始 observableArray,这样它就可以更新了。然后,在更新时,您使用更新的数据和要更新的映射对象调用 ko.mapping.fromJS

那时的另一个小变化就是在计算的 observable 中使用 value() ,因为它是映射插件中的 observable。

示例: http://jsfiddle.net/rniemeyer/3La5K/

关于knockout.js - Knockout 的映射破坏了可观察的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9035673/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com