我正在使用 Knockout 来实现类(class)列表选择工具。我正在使用下面的方法来填充数据 (MVC3/Razor),以便在最初填充 View 模型时,我可以毫无问题地使用每个 KO 数组(即 CourseList、ScheduleList)。但是,当服务器的初始加载返回零行时,这意味着 View 模型的“ScheduleList”属性为空,则无法调用任何方法,例如 .push() 或 .removeAll()。据推测,这意味着从未创建可观察数组,因为没有任何东西可以填充它。填充模型后,ScheduleList 属性会填充一个列表。当 MVC 操作将其返回为空时,实例化它的最佳方法是什么?有一个 jsFiddle 似乎可以解决它,但是当我尝试使用“创建”选项时,它会使我的整个模型变为空白。我不确定“创建”选项的语法是什么。 jsFiddle 在这里:http://jsfiddle.net/rniemeyer/WQGVC/
// Get the data from the server
var DataFromServer = @Html.Raw(Json.Encode(Model));
// Data property in viewmodel
var data = {
"CourseList": DataFromServer.CourseList ,
"ScheduleList": DataFromServer.ScheduleList
};
$(function() {
// Populate Data property
viewModel.Data = ko.mapping.fromJS(data);
// ko.applyBindings(viewModel, mappingOptions);
ko.applyBindings(viewModel);
});
当初始页面加载未填充 ScheduleList 时,以下代码将引发错误。如果初始页面加载包含数据,那么您可以调用 .removeAll() 和 .push() 等。
var oneA= 'abc';
// push not working
this.Data.ScheduleList.push( oneA );
最佳答案
设置你的映射参数,让它在创建时如此,你给它一个特定的结构。然后它将为您进行更新。
最有可能发生的情况是您的 DataFromServer
实际上根本不包含 ScheduleList
属性。因此,当它被映射时,永远不会产生相应的属性。映射器只会将现有属性映射到可观察对象。
您需要在 create
选项中设置 View 模型,以便在未设置任一数组时添加空数组。这样一来,您的 View 模型最终将具有相应的可观察数组。
通过确保 CourseList
或 ScheduleList
是一个数组,映射 View 模型会将它们映射为 observableArray
对象,因此您的代码将作为你预料到了。
var DataFromServer = {
'CourseList': [1,2,3]
//, 'ScheduleList': []
};
var dataMappingOptions = {
'create': function (options) {
var data = options.data;
data.CourseList = data.CourseList || [];
data.ScheduleList = data.ScheduleList || [];
return ko.mapping.fromJS(data);
}
};
viewModel.Data = ko.mapping.fromJS(DataFromServer, dataMappingOptions);
关于javascript - 如何在初始 View 模型加载为空时初始化 Knockout View 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12982376/