javascript - ObservableArray.RemoveAll() 清空不同变量中的串联对象

标签 javascript arrays reference knockout.js

在我的 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 清空底层数组,您的两个可观察对象似乎引用了同一个数组。

一个简单的选择是将 currentProjects 设置为一个空数组,而不是调用 removeAll

self.currentProjects([]);

现在,原来的数组将保持原样。

关于javascript - ObservableArray.RemoveAll() 清空不同变量中的串联对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13687823/

相关文章:

javascript - HTML5 Context/Canvas - 何时在上下文上调用绘制

javascript - 如何获取父组件引用

c++ - 如何检查字符数组中是否存在字符串值?

c++ - 在引用 C++ 中存储函数的返回值

Java:如何在第三个类中创建两个不同类的实例并通过构造函数相互传递引用

javascript - 如何在 es6 中启用 ts-check

javascript - 简单的 Ajax 自动完成示例,无法使用 PHP

c++ - 如何将数组作为参数传递?

php - in_array 函数未给出预期结果

java - 常见的 Java 内存/引用泄漏模式?