【问题标题】:Prevent observables from updating when I don't want them to with KnockoutJS当我不希望使用 KnockoutJS 更新 observables 时,防止它们更新
【发布时间】:2015-12-09 06:49:20
【问题描述】:

我有一个 KnockoutJS 视图模型,它从可观察数组创建文件夹列表。数组中的每个项目都有两个属性。文件夹名称必须是可观察的,因为它们可以由用户编辑。

self.folders = ko.observableArray([{
    name: ko.observable('Inbox'),
    editing: ko.observable(false)
}, {
    name: ko.observable('Vacations'),
    editing: ko.observable(false)
}]);

然后,我有一个对象列表,这些对象“在”这些文件夹中具有多个属性,但其中一个是文件夹的名称。文件夹的名称设置为 observable,因此如果名称更改,对象将保留在正确的文件夹中:

self.emails = ko.observableArray([{
    from: 'Sport Clips',
    subject: '$4 Off',
    date: '9/6/2015',
    flagged: ko.observable(false),
    read: ko.observable(false),
    selected: ko.observable(false),
    folder: self.folders()[0].name,
    attachment:false,
}...]);

最后,我有一个更新函数,它可以根据用户的选择更新电子邮件文件夹参数的值。问题在于,当用户更新文件夹位置时,实际文件夹也会使用新名称进行更新(正如您所期望的,因为它是可观察的)。

self.moveEmails = function() {
    for(var i = 0; i < self.emails().length; i++) {
        if (self.emails()[i].selected() == true) {
            self.emails()[i].folder(this.name()); <-- this is where the name is updated
            self.emails()[i].selected(false);
        }
    } <-- this is just a loop that looks for checked items, it works fine
}

例如,如果我当前在“收件箱”文件夹中有一个对象,并且用户将其移动到“业务”文件夹,它会更新电子邮件对象以具有业务文件夹参数,但这会导致收件箱文件夹也改名为Business。

有什么办法可以防止这种情况发生,或者有没有更好的办法来避免这个问题?

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    您的电子邮件的folder 属性应分配给文件夹,而不是其名称。

    folder: self.folders()[0].name,
    

    当你更新它时,你应该为它分配一个新文件夹。如果this 是您的moveEmails 函数中的文件夹,

    self.moveEmails = function() {
        for(var i = 0; i < self.emails().length; i++) {
            if (self.emails()[i].selected() == true) {
                self.emails()[i].folder = this; <-- change folders
                self.emails()[i].selected(false);
            }
        } <-- this is just a loop that looks for checked items, it works fine
    }
    

    否则你需要根据this找到合适的文件夹。

    【讨论】:

    • 这不是找到合适值的问题。 moveEmails 函数现在的方式是获取适当的值。
    • 虽然代码没有帮助,但您关于将其分配给文件夹而不是名称的评论通过一些解决方法解决了我的问题,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多