1

ヒットした URL に応じて、対応するコントロールが設定されるように、CanJS でルーティングを設定したいと考えています。私の問題は、コントロールでリッスンするデフォルトルートを表現する方法を見つけようとしていることです:「一致するものがない場合は、これを実行してください」. これを行うためのヒントはありますか?

これはこれまでの私のコードです。/#!/plant/1/day/3andのような URLでは機能するようですが、 or/#!/plant/1では機能しないようです/#!/

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

次のようなことをすることになりましたが、理想的とは言えません...

    "{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 に答える