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