在我的 KnockoutJS View 模型逻辑中,我有一个当前显示的对象(项目 View 模型)的可观察数组: self.currentProjects
。根据项目过滤器设置(用户动态选择项目类型),self.currentProjects
保存 UI 绑定(bind)到的不同对象。
在某些时候,我需要将不同的项目加载到 View 中,我需要清空 currentProjects 并将不同的模型集放入其中。我通过调用 self.currentProjects.removeAll();
来做到这一点 问题是当我调用它时,另一个应保存对同一组模型的引用的可观察数组 self.ProjectModels
似乎也被清空了。我应该如何管理可观察数组中的对象,以便从一个数组中删除不会导致另一个为空。
这是一个操作相关的代码:
//Another menu item is selected
self.selectItem = function(newId) {
self.selectedItemId(newId);
self.currentProjects.removeAll(); //This is the point where self.ProjectModels also looses model references
var someProjectsLoaded = false;
jQuery.each(self.projectModels, function (i, val) {
if (val.type == self.selectedItemId()) {
self.currentProjects(val.models);
var projectsPerPage = parseInt($('#ProjectsPerPage').val(), "10");
self.page(val.models.length / projectsPerPage);
someProjectsLoaded = true;
}
});
if (!someProjectsLoaded) {
self.page(1);
self.LoadMoreProjects();
}
};
self.LoadMoreProjects = function() {
var getProjectsUrl = $("#GetNextProjectsUrl").val();
$.ajax({
url: getProjectsUrl,
data: {
page: parseInt(self.page(), "10"),
type: self.selectedItemId()
},
beforeSend: function () {
//$("#ajaxload").show();
},
success: function (result) {
var newlyAddedModelsArray = jQuery.map(result, function (val, i) {
var vm = new ProjectViewModel(val, self);
self.currentProjects.push(vm);
return vm;
});
self.page(parseInt(self.page(), "10") + 1);
var typeAlreadyInChache = false;
jQuery.each(self.projectModels, function (i, val) {
if(val.type == self.selectedItemId()) {
val.models = val.models.concat(newlyAddedModelsArray); //HERE IS WHERE I SUSPECT A COPY BE REFERENCE TAKES PLACE
typeAlreadyInChache = true;
}
});
if(!typeAlreadyInChache) {
self.projectModels.push({ type: self.selectedItemId(), models: newlyAddedModelsArray });
}
},
error: function () {
$("#error").show();
}
});
};
最佳答案
调用 removeAll
会清空底层数组,并且您的两个 observable 似乎引用了同一个数组。
一个简单的选择是将 currentProjects
设置为空数组,而不是调用 removeAll
。
self.currentProjects([]);
现在,原始数组将保持原样。
关于javascript - ObservableArray.RemoveAll() 清空不同变量中的连接对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13687823/