【问题标题】:Knockout - resetting an observable array of observables淘汰赛 - 重置可观察的可观察数组
【发布时间】:2015-10-05 01:26:22
【问题描述】:

我有一个可观察的可观察数组,如下所示

appViewModel.rollArray = ko.observableArray([{
        diceAmount: ko.numericObservable(1),
        diceType: ko.observable(null),
        diceAddition: ko.numericObservable(0),
        diceMultiplication: ko.numericObservable(1)
    }]);

还有一些绑定正在监视这些属性,例如以下

<input type="number" data-bind="value: rollArray()[rollIndex()].diceAmount" />

这个数组在 Web 应用程序中被填充和改变了很多,但我需要一个“重置”按钮。这会将 appViewModel.rollArray 恢复到其默认状态(如我在上面定义的)。问题是,如果我简单地重新定义 rollArray,那么绑定都将停止工作。同样,如果我尝试从 rollArray 执行 removeAll() 然后推入默认值的对象,则绑定会在 removeAll 之后立即通知并生成错误,因为它们无法在数组中找到这些属性。

有解决这个问题的好方法吗?

当前解决方案

它并不优雅(这也是我在这里提出问题的原因),但目前我只是将一个新元素推送到修改后的数组上,然后将其他所有内容拼接起来。

appViewModel.rollArray.push({
            diceAmount: ko.numericObservable(1),
            diceType: ko.observable(null),
            diceAddition: ko.numericObservable(0),
            diceMultiplication: ko.numericObservable(1)
        });
appViewModel.rollArray.splice(0,appViewModel.rollArray().length-1);

【问题讨论】:

    标签: javascript arrays knockout.js


    【解决方案1】:

    您可以重新分配数组值,而不是推送/拼接:

    appViewModel.rollArray([{
        diceAmount: ko.numericObservable(1),
        diceType: ko.observable(null),
        diceAddition: ko.numericObservable(0),
        diceMultiplication: ko.numericObservable(1)
    }]);
    

    【讨论】:

      猜你喜欢
      • 2012-09-08
      • 2014-11-05
      • 2012-07-07
      • 2015-01-25
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      相关资源
      最近更新 更多