Knockout.js 无法将项目正确添加到可观察数组

Knockout.js 无法将项目正确添加到可观察数组,knockout.js,Knockout.js,我正在从JSON数据创建一个可观察的数组。最初创建viewmodel时出错,或者向数组中添加新数据时出错。添加到阵列后,当I console.log退出阵列时,新添加的数据不同。 以下是一个屏幕截图: 正如您所看到的,brocCode=1800之后的对象与数组中以前的所有项目不同。我认为问题在于,当我向表中添加新行时,我正在创建一个新的itemModel,并将其添加到items列表中。当我获取JSON数据并将其作为可观察数组时,我并没有创建itemModels的可观察数组 下面是我的Knocko

我正在从JSON数据创建一个可观察的数组。最初创建viewmodel时出错,或者向数组中添加新数据时出错。添加到阵列后,当I console.log退出阵列时,新添加的数据不同。 以下是一个屏幕截图: 正如您所看到的,
brocCode=1800
之后的对象与数组中以前的所有项目不同。我认为问题在于,当我向表中添加新行时,我正在创建一个新的
itemModel
,并将其添加到items列表中。当我获取JSON数据并将其作为可观察数组时,我并没有创建
itemModel
s的可观察数组

下面是我的KnockoutJS:(具体看一下self.addLine函数和
self.items=ko.observearray(items);
中的
itemsModel
):


对Document.ready调用
GetItems()

您的
itemsJSON
是一个普通对象数组。尽管它们可能看起来像
项目模型
(它们共享相同的属性名),但有一个很大的区别:它们没有可观察的属性值,也没有经过扩展验证的值

addLine
方法中,通过调用
newitemmodel()
正确实例化一个新的
itemModel
。因此,您的可观察数组将包含普通对象和
itemModel
实例的混合。这不一定是个问题,但是如果您希望能够轻松地处理数组的值,最好确保它们都共享相同的类型

通过迭代
itemsJSON
中的对象,可以将初始数据映射到正确的viewmodels:

var itemModels = itemsJSON.map(function(data) {
  return new itemModel(data);
});
我建议您遵循命名约定,将
itemModel
重命名为
itemModel
。如果适合您的样式,您可以创建一个静态帮助器方法,该方法将为您返回一个新实例:

ItemModel.create = function(data) { return new ItemModel(data); };

var itemModels = itemsJSON.map(ItemModel.create);

您需要使用
ko.mapping.fromJS()
,以便将现有
itemsJSON
中的所有属性转换为
ko.observable()
。请尝试
var itemsJSON=ko.mapping.fromJS(@Html.Raw(…))
(您可能需要安装映射插件:)无骰子,
错误:初始化可观察数组时传递的参数必须是数组,或为null,或者未定义。
我想我需要以某种方式将它转换为一个itemModelMap数组,再转换为一个模型数组:
ko.observearray(items.map(function(data){return new itemModel(data)})@user3297291,行得通!非常感谢。如果您愿意,可以添加作为答案。现在我只需要找出匹配(arrayFirst)函数不起作用的原因。但我会就此提出另一个问题。
ItemModel.create = function(data) { return new ItemModel(data); };

var itemModels = itemsJSON.map(ItemModel.create);