我不知道为什么我必须在这个可观察数组上调用 valueHasMutated



我使用的是Durandal框架。我有一个记录器模块,它显示并存储显示给用户的消息。消息使用obsArray.push(…).存储在一个可观察的数组中

var logMessages = ko.observableArray();
logMessages.push({
            dt: dt,
            tp: type,
            msg: message
        });

没问题。在这个模块中,我还导出了obsArray变量。

var logger= {
        logMessages: logMessages,
    };
return logger;

在另一个名为"消息"的模块中,我有一个视图/视图模型,它从记录器中获取obsArray并显示消息。我在消息vm中有另一个可观察的数组_mess,它是通过执行来填充的

_mess(logger.logMessages())

可观察数组_mess与我的视图绑定。当我去看风景时,一切都很好。我在记录器中看到了可观察数组"logMessages"的内容。

然而,当我查看视图时,我可以按下一个按钮,调用记录器并在数组上进行推送。数据被添加到数组中,但我的视图不会自动更新。我必须在消息vm中的可观察数组上调用valueHasMuted,如下所示:

var addMessage = function () {
        logger.show('this is test');
        _mess.valueHasMutated();   // required to see the update appear in the view
    };

如果我不调用valueHasMuted,我的视图就不会更新。

这似乎是一个非常简单的用例,我可能只是缺少了一个步骤或配置。

感谢

问题是您设置了两个可观察器来引用同一个数组。这些单独的可观察对象有单独的订阅,即使底层数组发生了变化,一个可观察数组的更新也不会传播到另一个。

代替

_mess = ko.observableArray();
_mess(logger.logMessages());

写入

_mess = logger.logMessages;

所以您已经有了一个单独的"服务"来执行日志功能。此外,这些服务还直接公开Array。为什么不简单地在消息模块中引用它,并将视图直接绑定到它呢?

例如:

// Logger
var logger= {
        logMessages: logMessages,
    };
return logger;
// Messages
var messages = {
  this.service = require('path/to/logger');
}
// Messages View
<ul data-bind="foreach: service.logMessages">
...

通过这样做,您可以避免有额外的可观测值或对现有可观测值的引用,这也有助于保持逻辑的隔离和访问方式的统一。

最新更新