can.routing:触发更改从#!/ foo / bar转到#!/ foo

时间:2013-10-16 08:54:47

标签: javascript url-routing canjs canjs-routing

我想了解CanJS的路由。到目前为止,我已经设置了以下路线。

can.route('plant/:plant/', {
    plant : undefined,
    day : undefined
});
can.route('plant/:plant/day/:day', {
    plant : undefined,
    day : undefined
});

我还没有设置听众,因为我只是在控制台中尝试这个。以下工作正常:

can.route.attr({plant : 1}) // ==>  #!plant/1/
can.route.attr({plant : 1, day : 3}) // ==>  #!plant/1/day/3

但是在我这样做之后,我想触发一个事件在层次结构中“向上”,回到#!/ plant / 1级别。我试过做can.route.attr({plant : 1, day : undefined})但是没有做任何事。 can.route.attr({plant : 1, day : null})刚刚导致#!plant/1/day/null

那么如何“重置”路线到现在“知道”它到底是哪一天?

2 个答案:

答案 0 :(得分:0)

在我了解到can.route基本上就是所谓的Observable后,我明白我实际上要做的就是删除一个属性。要做到这一点,所有人必须做的是

can.route.removeAttr('day') // ==> #!plant/1/

答案 1 :(得分:0)

我遇到了同样的问题,并想在此处记录。实现此目的的更好方法是使用can.route.url方法生成适当的路由URL。不幸的是,canjs没有实现routeTo方法,它会抽象掉以下代码(并且还可以确定在可用时是否使用pushstate ......):

can.route('plant/:plant');
can.route('plant/:plant/day/:day');

window.location.hash = can.route.url({plant: 1}); // #!plant/1
window.location.hash = can.route.url({plant: 1, day: 2}); // #!plant/1/day/2

理想情况下,我们应该能够做到这样的事情:

can.routeTo({plant: 1});
// #!plant/1        (without pushstate)
// [root]/plant/1   (with pushstate)

注意:我将在接下来的几周内构建此功能,并可能会发送拉取请求。