Mvvm Knockoutjs——调用ValueHas变异太频繁了?

Mvvm Knockoutjs——调用ValueHas变异太频繁了?,mvvm,knockout.js,Mvvm,Knockout.js,因此,我的应用程序中有一个页面,它使用了相当标准的嵌套模型实现,类似于标准的Customer->Order->OrderLineItems类型。对我来说,不同之处在于OrderLineItems的模型非常复杂 在我的代码中,无论是可观测数组还是可观测数组,为了正确更新视图,我发现我调用了很多“myObservable.valueHasMutated()” 有种直觉认为,必须手动完成这项工作并不像它应该做的那样——但我不确定该去哪里寻找可能需要更改的内容。所以有几个问题: 这对于“深/大”型号来说

因此,我的应用程序中有一个页面,它使用了相当标准的嵌套模型实现,类似于标准的Customer->Order->OrderLineItems类型。对我来说,不同之处在于OrderLineItems的模型非常复杂

在我的代码中,无论是可观测数组还是可观测数组,为了正确更新视图,我发现我调用了很多“myObservable.valueHasMutated()”

有种直觉认为,必须手动完成这项工作并不像它应该做的那样——但我不确定该去哪里寻找可能需要更改的内容。所以有几个问题:

  • 这对于“深/大”型号来说正常吗
  • 有没有什么明显的方法可以解决这个问题
  • 在web上有这样一个用KO实现的复杂模型的例子吗
  • 我在viewmodel中拥有的一个示例:

    self.projectsVisible = ko.observable(false);
    self.toggleProjectVisibility = function () {
        self.projectsVisible(!self.projectsVisible());
        self.projectsVisible.valueHasMutated();
    };
    
    它绑定到一个按钮元素和一个DIV:

    <div data-bind="visible: projectsVisible">
        <table>
            <thead data-bind="template: {name: 'projectHeader'}"></thead>
            <tbody data-bind="template: {name: 'project', foreach: projects}"></tbody>
        </table>
    </div>
    <button type="button" data-bind="click: toggleProjectVisibility">
      Toggle Projects On/Off
    </button>
    
    
    打开/关闭项目
    
    我使用
    valuehassmutated
    主要用于观察到的变化

    在您的示例中,
    self.projectsVisible(!self.projectsVisible())已通知订阅者,因为值总是更改。因此,调用
    valuehassmutated
    会再次通知订阅者相同的值更改

    您可以检查此小提琴:

    如果要通知订阅者对可观察对象执行
    写入
    操作,即使值保持不变,也可以使用
    .extend({notify:'always'})
    扩展程序(请参阅)


    最后,我认为您可以尝试列举调用
    valuehassmutated
    的情况,您最终可能会发现冗余调用。

    也许您可以从JSFIDLE中得到一些说明问题的信息?很少有情况下您需要自己调用
    valuehassmutated
    。通常,当您直接修改observable/observableArray持有的对象/数组并希望触发更新时,或者当您创建订阅并希望立即触发它时,将使用此选项。在切换布尔值的情况下,您不应该需要它。我认为JSFIDLE可以帮助我们缩小范围。我也有类似的问题。JSFIDLE here:在这个问题中,有人建议我调用valueHasMutated()以使我的更改生效。