Knockout使用knockout-amd-helper插件和pub-sub-publish发生在订阅它的模块加载之前

时间:2014-11-08 01:27:56

标签: knockout.js knockout-amd-helpers

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

我的主页有两个部分,导航和mainContainer,都作为模块加载(外部html模板和js文件),我设置了带有observable的模块的名称,因此可以动态替换它。在mainContainer中,有一棵树,如果用户点击树的任何节点,那么应该发生两件事。 1.整个mainContainer模块需要在同一个div标签中替换为名为“detail”的不同模块。 2.根据用户在mainContainer中单击的树中的节点,我需要将值作为参数传递给此'detail'模块。

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

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

我通过调用根模块上的订阅(详细模块的父节点)来进行临时工作,但在我看来这是一个肮脏的解决方案,理想情况下我希望将此逻辑保留在详细模块本身中。

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

由于

1 个答案:

答案 0 :(得分:0)

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

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

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

您可以填充它:

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

使用类似的绑定:

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

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