5

我在名为“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();
};

请注意,可以将不同类型的元素添加到 Deletions observableArray。在“取消删除”功能中,我唯一需要做的就是将“销毁”标志设置为 false。但是,我不能让它工作:

this.unremovePage = function(deletion){
    deletion.element()._destroy(false);
}

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

编辑

我无法为嵌套的 FormElements 工作。结构是:我的主要 ViewModel 称为“FormBuilder”。FormBuilder 有多个页面(它们本身就是 ViewModel),每个页面都有多个 FormElement(参见上面的代码片段)。

我可以“取消删除”那些 FormElement,但我不知道如何强制刷新它们。

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
};
  • FormBuilder 是主要的 ViewModel;
  • FormBuilder 有一个名为 Pages 的 observableArray,每个 Page 都是一个 ViewModel;
  • 每个Page都有一个名为FormElements的observableArray,每个FormElement都是一个ViewModel;
  • FormBuilder 有一个名为 Deletions 的 observableArray,每个 Deletion 都是一个 ViewModel,每个 Deletion 都包含一个元素,可以是 Page 或 FormElement。

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

4

1 回答 1

7

_destroy is not an observable. So, what you can do it set _destroy to false and then call valueHasMutated on the observableArray, so that any subscribers (the UI) knows that it may need to make updates.

So, you would want to deletion.element()._destroy = false; and then call self.deletions.valueHasMutated().

于 2012-09-17T13:25:06.493 回答