我有一个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。
有没有办法阻止这种情况,还是有更好的方法来编写它来避免这个问题?
答案 0 :(得分: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
找到合适的文件夹。