Durandal 2.0.1。我有一个主路由的主路由器和子路由器,该路由的shell模块的代码(咖啡):
define ['plugins/router'], (router) ->
router = router.createChildRouter().makeRelative({ fromParent: true })
return {
activationData: null
router: router
activate: () ->
@activationData = <some data>
routes = <child routes>
router.reset().map(routes).buildNavigationModel()
return
}
该路线的shell模块的Html:
<div class="tab-sub-links">
<!-- ko foreach: router.navigationModel -->
<a tabindex="-1" data-bind="css: { active: isActive }, attr: { href: hash }, text: title"></a>
<!-- /ko -->
<div class="clearfix"></div>
</div>
<div class="tab-content">
<div class="content-wrapper" data-bind="router: { transition: 'entrance', cacheViews: true, activate: true, activationData: activationData }"></div>
</div>
其中一个子模块:
define ['knockout'], (ko) ->
return {
mainData: null
activate: (activationData)->
@mainData = activationData //always undefined
return
}
问题是:激活数据未传递给子视图。 我挖掘了compose.js并发现当模型传递给compose时传递了activationData,在我的视图绑定模型中是router.activeItem,但是activeItem是空的,直到路由被激活并且compose在此之前运行。为什么?我该怎么办?
修改
更改了绑定:
router: {cacheViews: false, activationData: activationData}
到:
compose: {model: router: activeItem, attached: router: attached, compositionComplete: router.compositionComplete, cacheViews: false, activationData: activationData}
无济于事,这是可以预料的,因为路由器绑定通过params来组成绑定,所以两个记录实际上也是一样的。
答案 0 :(得分:0)
Durandal的路由器支持基于散列的参数,但不支持activationData http://durandaljs.com/documentation/Using-The-Router/。
假设customer/:customerId/orders/:orderId
之类的路由允许在activate
期间检索 activationData ,例如
function activate(customerId, orderId){
//retrieve activationData from backend based on customerId and/or orderId
}
根据评论更新
http://durandaljs.com/documentation/Conversion-Guide/
新路由器现在不仅支持参数化路由,还支持可选参数,splats和查询字符串。
使用路由器时没有激活数据支持,因为所有信息都需要作为URL哈希值传递。处理这种情况的推荐方法是在activate
期间根据传入的参数检索数据(见上文)。
可以考虑使用没有路由器的替代组合。如果组合模型需要支持完整的生命周期事件(通常由路由器提供),则必须使用自己的activator
。
https://github.com/dFiddle/dFiddle-2.0/blob/gh-pages/app/masterDetail/wizard2/wizard.js#L10
define(['durandal/activator', './step', 'knockout'], function( activator, Step, ko ) {
var ctor = function( options ) {
...
this.activeStep = activator.create();
...
};
return ctor;
});
实时版:http://dfiddle.github.io/dFiddle-2.0/#master-detail/wizard2