'Undestroy'在Knockout中的一个对象

She*_*ock 4 javascript knockout.js

我在一个名为"Deletions"的observableArray中跟踪已删除的对象.我在UI中解析该数组以创建"撤消删除"链接,但我无法使其工作.代码非常简单,看起来像这样:

this.removePage = function(page){
    self.formBuilder.pages.destroy(page);
    var newDeletion = new Deletion();
    newDeletion.element(page);
    self.deletions.push(newDeletion);
}

this.removeFormElement = function(element){
    self.formElements.destroy(element);
    var newDeletion = new Deletion();
    newDeletion.element(element);
    builder.deletions.push(newDeletion);
}

var Deletion = function(){
    var self = this;
    this.element = ko.observable();
};
Run Code Online (Sandbox Code Playgroud)

请注意,可以将不同类型的元素添加到Deletions observableArray中.我需要在'unremove'函数中做的唯一事情就是将'destroy'标志设置为false.但是,我无法让它工作:

this.unremovePage = function(deletion){
    deletion.element()._destroy(false);
}
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?

编辑

我不能让它适用于嵌套的FormElements.结构是:我的主ViewModel被称为'FormBuilder'.FormBuilder有多个页面(这些是ViewModel本身),每个页面都有多个FormElements(参见上面的代码片段).

我可以"取消删除"那些FormElements,但我不知道如何强制刷新它们.

this.unremove = function(deletion){
    //console.log(deletion.element);
    deletion.element()._destroy = false;
    self.deletions.remove(deletion);
    self.formBuilder.pages.valueHasMutated(); // works
    deletion.element().valueHasMutated(); // this doesn't work 
    self.formBuilder.pages.indexOf(deletion.element()).valueHasMutated(); // neither does this
    self.deletions.valueHasMutated(); // works
};
Run Code Online (Sandbox Code Playgroud)
  • FormBuilder是主要的ViewModel;
  • FormBuilder有一个名为Pages的observableArray,每个Page都是一个ViewModel;
  • 每个Page都有一个名为FormElements的observableArray,每个FormElement都是一个ViewModel;
  • FormBuilder有一个名为Deletions的observableArray,每个Deletion都是一个ViewModel,每个Deletion都包含一个元素,一个是Page或一个FormElement.

问题:我使用函数'unremove'将元素的'destroy'属性(Page或FormElement)设置为false.如您所见,然后我在页面上调用'valueHasUpdated'.但是如何在observableArray上调用formElements单个Page包含的内容?

RP *_*yer 7

_destroy不是一个可观察的.因此,您可以将其设置_destroy为false然后调用valueHasMutatedobservableArray,以便任何订阅者(UI)知道它可能需要进行更新.

所以,你想要deletion.element()._destroy = false;然后打电话self.deletions.valueHasMutated().