1

我想用 CanJS 设置路由,以便根据我点击的 url,设置一些相应的控件。我的问题是试图找到一种方法来表达要在控件中侦听的默认路由:“如果没有匹配,则执行此操作”。有什么建议吗?

到目前为止,这是我的代码。似乎适用于 and 之类的网址/#!/plant/1/day/3/#!/plant/1但不适用于/#!or/

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

var Router = can.Control({}, {
  init : function () {},

  "{can.route}" : function (route, event, newVal, oldVal) {
    console.log('Init default control');
  },

  "{can.route} plant_id" : function (route, event, newVal, oldVal) {
    console.log('Init plant control');
  },

  "{can.route} day" : function (route, event, newVal, oldVal) {
    console.log('Init day control');
  }
});

PS我实际上通过这样做使用Can.Control.route插件来做到这一点:

"route" : function (route, event, newVal, oldVal) {
    console.log('route Default route', arguments);
}

但是路由插件似乎既设置路由又对它们做出反应,我想知道如何在没有特定插件的情况下做到这一点。

4

3 回答 3

2

您的解决方案有效,但您也可以使用can.Control.route插件,它可以让您直接在控制器操作中定义和收听路由:

var Router = can.Control({
    init : function(el, options) {
    },

    "/:plantId route" : function(data) {
        // the route says /id
        // data.id is the id or default value
    },

    route : function(data){
        // the route is empty
    }
});
new Router(window);
于 2013-10-24T13:27:24.110 回答
0

我注意到默认的“/”路由存在同样的问题。我深入研究了 pushstate.js,发现它在默认路由下无法正常工作。您可以在此处查看更多详细信息:https ://forum.javascriptmvc.com/#Topic/32525000001460049

如果没有 pushstate.js(使用 #!),我还没有测试过任何东西,所以这只适用于使用 pushstate。

于 2013-11-02T23:23:43.267 回答
0

最终做了类似以下的事情,但感觉不太理想......

    "{can.route} change" : function (ev, attr, how, newVal, oldVal) {
        if(newVal=== 'add' && (!ev.attr('plant_id') && !ev.attr('day')))
        console.log('{can.route} Default route', arguments);
    },
于 2013-10-23T23:05:38.930 回答