首先,我是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中发生了。所以我订阅了一个已经发布过的主题,因此无法超越已发布的值。
我通过调用根模块上的订阅(详细模块的父节点)来进行临时工作,但在我看来这是一个肮脏的解决方案,理想情况下我希望将此逻辑保留在详细模块本身中。
这更像是一个设计问题,所以我没有发布代码,但我想知道是否有人可以评论我是否应该采用不同的方法,或者是否有技术解决方案。
由于
答案 0 :(得分:0)
您可以考虑将额外信息作为初始化数据传递给您的"详细信息"模块。
如果模块返回一个函数(构造函数),那么该值将传递给函数本身。如果您的模块返回一个对象,那么它将被传递给initialize
函数。
因此,您可以绑定一个包含模块绑定配置对象的observable,而不是只绑定一个可观察的模块名称。
您可以填充它:
this.currentModule({
name: "details",
data: someData
});
使用类似的绑定:
<div data-bind="module: currentModule"></div>