Durandal:无法通过子路由器传递activationData

时间:2013-12-02 05:23:09

标签: durandal

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来组成绑定,所以两个记录实际上也是一样的。

1 个答案:

答案 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