0

首先,我是 knockoutjs 的新手,我已经开始使用 knockout-amd-helpers 开发应用程序,并且我们正在使用 require.js 来加载模块。我在发布订阅方面面临以下问题:

我的主页有两个部分,navigation 和 mainContainer,它们都作为模块(外部 html 模板和 js 文件)加载,并且我正在使用 observable 设置模块的名称,以便可以动态替换它。在 mainContainer 中,有一棵树,如果用户单击树的任何节点,则应该发生两件事。1. 整个 mainContainer 模块需要在同一个 div 标签中替换为另一个名为“detail”的模块。2. 基于树中的节点,即用户在 mainContainer 中单击,我需要将该值作为参数传递给这个“详细信息”模块。

我想我可以实现 1. 通过将模块名称设置为 observable 和 2. 通过在特定主题的 mainContainer 和详细模块中发布节点值,我需要订阅该主题并使用“数据”传递给模块' 属性。

因此,在树节点的 onclick 事件中,我发布了节点值,并更改了 observable 中的模块名称值,从而成功地将 mainContainer 替换为详细模块。但是在详细信息模块中,即使我订阅了已发布的主题,它也无法获取值,因为此订阅发生在详细信息模块中,并且一旦用户单击节点,详细信息模块就已加载,并且因此,在 mainContainer 中已经进行了发布之后。所以我订阅了一个已经发布的主题,因此无法获得过去的发布值。

我通过调用根模块(细节模块的父级)上的 subscribe 来临时解决这个问题,但在我看来这是一个肮脏的解决方案,理想情况下我想将此逻辑保留在细节模块本身中。

这更像是一个设计问题,所以我没有发布代码,但我想知道是否有人可以评论我是否应该以不同的方式处理这个问题,或者是否有技术解决方案。

谢谢

4

1 回答 1

0

您可以考虑将额外信息作为初始化数据传递给您的“详细信息”模块。

如果您的模块返回一个函数(构造函数),则该值将传递给函数本身。如果您的模块返回一个对象,那么它将被传递给initialize函数。

因此,您可以绑定一个包含模块绑定配置对象的可观察对象,而不是只绑定一个可观察的模块名称。

你会像这样填充它:

this.currentModule({
     name: "details",
     data: someData
});

使用如下绑定:

<div data-bind="module: currentModule"></div>

这是一个示例:http: //jsfiddle.net/rniemeyer/ctx083w3/

于 2014-11-08T02:44:48.293 回答