javascript - 更新knockout js中的数组项

标签 javascript jquery arrays knockout.js

我在 KnockoutJS 可观察数组中有一个“用户”数组。我可以将用户添加到数组中,它会正确更新 View ,但用户的编辑目前让我抓狂,可能是因为我对基本概念稍微缺乏理解。

查看模型

var viewModel = {
    users: ko.observableArray(),
    user: ko.observable(),
    showEditForm: function (model) {
        if (!$('#users-form').is(':visible')) {
            $('#mask').show();
        }
        showUsersLoading();
        loadUserIntoEditForm(model.Id);
    },
    getUser: function (userId) {
        for(var i = 0; i < this.users().length; ++i)
        {
            if (this.users()[i].Id === userId)
            {
                this.user(this.users()[i]);
                break;
            }
        }
    }
};

用户 View 模型(目前主要用于添加功能)

   var userViewModel = function (id, username, statusDescription, email) {
        var self = this;
        self.Id = ko.observable(id),
        self.Name = ko.observable(username),
        self.StatusDescription = ko.observable(statusDescription),
        self.Email = ko.observable(email)
    };

更新/编辑是在 MVC 部分 View 中执行的,该 View 会触发 ajax 请求来更新用户服务器端,然后在成功响应后运行以下代码来更新用户

viewModel.getUser(result.Id);
viewModel.user().StatusDescription('locked');
viewModel.user().Name('testingUpdate');

这给了我一个Uncaught TypeError: string is not a function错误

这就是我的理解失败的地方。我发现我从 users 数组中获取的用户没有可观察的属性,这就是为什么我无法使用 Knockout 函数方法进行更新的原因,我通过在中提取 users 数组的详细信息来确认这一点浏览器控制台窗口。

我还知道,从概念上讲,我想将用户可观察对象转换为 userViewModel 对象,以便属性变得可观察,并且我可以更新它们;或者我希望用户可观察数组知道它包含的对象应该是 userViewModel 类型,因此对象属性是可观察的。

我遇到的问题是,虽然我理解这个概念,但我无法弄清楚实际使其工作的代码。

最佳答案

问题在于 this 关键字。在您的示例中,它没有指您所期望的内容。

尝试使用 RMP(揭示模块模式)来简化编写代码的方式。它看起来像这样:

var viewModel = (function() {
    var users = ko.observableArray();
    var user = ko.observable();

    // This one changes: you can use the vars directly

    var getUser = function (userId) {
        for(var i = 0; i < users().length; ++i)
        {
            if (users()[i].Id === userId)
            {
                user(this.users());
                break;
            }
        }
    }

    // Reveal the data

    return {
        users: users,
        user: user,
        getUser : getUser
    };

})();  // self-executing anonymous function 

匿名函数在你的变量周围放置了一个闭包。您可以在该闭包内安全地使用变量,并且它们在闭包外部不可用。此外,您可以通过简单地不透露它们来拥有“私有(private)变量”。

附加说明:我建议您使用lodashunderscore简化数组操作:您可以避免编写循环来查找数组中的元素。例如使用 lodash find .

关于javascript - 更新knockout js中的数组项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25908320/

相关文章:

Java - 使用 Point 类返回二维数组中的位置值

javascript - 用于从 javascript 中的数组获取所有唯一对、三重音等的通用函数

javascript - 是否可以从行内容中过滤/分离 PHP 中的 MySQL 数据?

javascript - 使用 jQuery 隐藏父 div

javascript - 用于 PhoneGap 的 zepto.js 与 xuijs

php - 通过 ajax 到 PHP 的多维数组

javascript - jQuery 可滚动、可排序、可过滤表

javascript - react 草稿所见即所得 : Image Upload when I click the "Add" Button

javascript - 与原始 sifr 3 相比,使用 jquery sifr 插件有哪些缺点?

php - 尝试从此处获取多列的平均值,但所有值都打印为 0