2

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

在我的代码中,无论是可观察数组还是可观察对象,为了正确更新我的视图,我发现我经常调用“myObservable.valueHasMutated()”。

不得不手动执行此操作并不像应有的那样,这是一种直觉 - 但我不确定在哪里查看可能需要更改的内容。所以有几个问题:

  1. 这对于“深/大”模型来说是正常的吗?
  2. 我可能会寻找一些明显的东西来解决这个问题吗?
  3. 网络上是否有使用 KO 实现的复杂模型的示例?

我的视图模型中的一个示例:

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>
4

1 回答 1

0

valueHasMutated主要用于 observableArray 的变化。

在您的示例中,self.projectsVisible(!self.projectsVisible());已经通知订阅者,因为该值总是在变化。因此,呼叫valueHasMutated会再次通知订阅者相同的值更改。

你可以检查这个小提琴:http: //jsfiddle.net/5RU7n/

write如果即使值保持不变,您也想通知订阅者对可观察对象的操作,您可以使用.extend({ notify: 'always' })扩展器(请参阅http://knockoutjs.com/documentation/observables.html)。

最后,我认为你可以尝试列举你调用的情况valueHasMutated,你最终可能会发现自己多余的调用。

于 2014-05-01T21:49:46.107 回答