Knockoutjs - 经常调用valueHasMutated?

时间:2012-11-09 21:06:42

标签: mvvm knockout.js

所以我在我的应用程序中有一个页面,它使用了一个相当标准的嵌套模型实现,与标准Customer一致 - >订单 - > OrderLineItems类型。我的不同之处在于OrderLineItems的模型非常复杂。

在我的代码中,既有可观察数组也有可观察数据,为了正确更新我的视图,我发现我最终调用了“myObservable.valueHasMutated()”。

这是一种直觉,不得不手动执行此操作并不是应该如此 - 但我不知道在哪里可以了解可能需要更改的内容。所以有几个问题:

  1. 这对“深/大”型号来说是否正常?
  2. 有没有明显的东西可以解决这个问题?
  3. 网上是否有像KO这样的复杂模型的例子?
  4. 我在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>
    

1 个答案:

答案 0 :(得分:0)

我主要使用valueHasMutated进行observableArray更改。

在您的示例中,self.projectsVisible(!self.projectsVisible());已经通知订阅者,因为值始终会更改。因此,呼叫valueHasMutated第二次通知订户进行相同的值更改。

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

如果您希望通过订阅者通知write操作,即使值保持不变,也可以使用.extend({ notify: 'always' })扩展程序(请参阅http://knockoutjs.com/documentation/observables.html)。

最后,我认为你可以尝试列举你调用valueHasMutated的情况,你最终可能会找到多余的电话。