Javascript 强制合成刷新

Javascript 强制合成刷新,javascript,durandal,Javascript,Durandal,我有一个路由(doctors/:id),它包含两个子页面(doctors/:id/索引和doctors/:id/详细信息)。这是my shell.html: <div id="content-head"> <h1>Page Title</h1> </div> <div id="content-main"> <ul class="tabs" data-bind="foreach: router.navigationMo

我有一个路由(doctors/:id),它包含两个子页面(doctors/:id/索引和doctors/:id/详细信息)。这是my shell.html:

<div id="content-head">
   <h1>Page Title</h1>
</div>

<div id="content-main">
   <ul class="tabs" data-bind="foreach: router.navigationModel()">
      <li data-bind="css: { selected: isActive }"><a data-bind="attr: { href: hash }, text: title"></a></li>
   </ul>

   <div id="content-main-inner" data-bind="router: {}"></div>
</div>

<aside data-bind="compose: { model: 'doctors/_sidebar/index' , view: 'doctors/_sidebar/index' }"></aside>

页面标题
边栏组合包括与页面相关的信息,例如统计信息和指向其他
:id
页面的链接


在两个子页面之间导航时,我希望侧边栏保持不变,但是当我从
doctors/100
转到
doctors/200
时,我希望侧边栏能够刷新并提供新数据。有没有办法做到这一点?

我建议您重构activate,去掉其中的数据加载代码,然后将其放入一个新函数中(必要时由activate调用)。然后使用Durandal事件订阅事件,并重新加载该事件的数据。然后在其他“子页面”中,在加载、激活或其他任何操作时触发该事件。

您可以在撰写时使用if绑定,并按如下方式切换:

<!-- ko if: $root.composeDimensionListShow -->
                    <!-- ko compose: here-->
<!-- /ko -->
对于某些情况,另一个答案可能更好,但在不实际的情况下,这会简单得多,并且更准确地回答您的问题


当您想刷新组合时,只需调用compositionlisttoggle()。

您想让它“刷新”,还是只需要绑定来更新新数据?您的视图模型应该处理数据中的更改并相应地更新绑定。我希望它再次执行侧栏的
activate
中的代码,以便它可以根据新ID获取数据。我刚刚找到了一种方法,通过将
activationData:[router.activeInstruction().params]
添加到合成中,它返回ID。但每次我更改选项卡时也会触发,即使ID保持不变。我建议您重构
activate
,并从中删除数据加载代码,然后将其放入新函数(根据需要由activate调用)。然后使用Durandal事件订阅事件,并重新加载该事件的数据。然后在你的其他“子页面”中,当它们加载或激活时触发该事件。我把shell改成这样:–然后我就订阅了边栏合成中的触发器,对吗?
 vm.composeDimensionListShow = ko.observable(false);
 vm.composeDimensionListToggle = function () {
    vm.composeDimensionListShow(true);
    vm.composeDimensionListShow.valueHasMutated(); //knockout will normally not update if it is already true, but we want to refresh every time regardless
};