当我不希望它们与KnockoutJS一起使用时,防止可观察者更新

时间:2015-09-12 23:58:29

标签: knockout.js

我有一个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,
}...]);

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

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。

有没有办法阻止这种情况,还是有更好的方法来编写它来避免这个问题?

1 个答案:

答案 0 :(得分:1)

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

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

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

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找到合适的文件夹。