Ember 1.0-rc2 に同梱されている新しいバージョンでは、実行時にルートを追加できますか? Ember.Router
3 に答える
現在、これを行う方法はサポートされていません。App.Router.map
呼び出しは、次のコードの 235 ~ 247 行で処理されます: https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/system/router.js
Ember.Router.reopenClass({
map: function(callback) {
var router = this.router = new Router();
var dsl = Ember.RouterDSL.map(function() {
this.resource('application', { path: "/" }, function() {
callback.call(this);
})
});
router.map(dsl.generate());
return router;
}
Router.map
前回の呼び出しのコールバックが保持されないため、呼び出すたびにマップが上書きされますRouter.map
。
編集
良くも悪くも、 への複数の呼び出しを許可するように動作を変更するためのプル リクエストを受け取りましたApp.Router.map
。何が起こるか見てみましょう。ここでフォローできますhttps://github.com/emberjs/ember.js/pull/2485
別の編集
プルリクエストがユーザーランドで行うことを行う要点を書きました。これにより、実行時にルートをマップできます。このコードを追加して、呼び出しをApp.Router.map
定義したメソッドに置き換えるだけです
https://gist.github.com/grep-awesome/5406461
回答変更編集
このプル リクエストの時点で、map
複数回呼び出すことができるようになりました。https://github.com/emberjs/ember.js/pull/2892
最新リリースの ember.js rc7Router.map
では、マップを上書きせずに複数回呼び出すことができる機能が に追加されました。これにより、実行時にルートを追加できます。
それが役に立てば幸い。
wmarbutの回答は受け入れられていないようですが、(私にとっては)良い回答です。彼のパッチは Ember リリースに向けて進んでいるようですが、それまでは彼のパッチを使用するコードです。(私の答えを受け入れないでください。これを見つけてうれしく思います。)コンテンツがナビゲーションを駆動できるようにするソリューションの一部として使用することを計画しています。良い質問です、user1517325 とありがとう、wmarbut!
// was an all-in-one router map as Ember likes it
// App.Router.map(function() {
// this.resource("foods", function(){
// this.route("index", {path: "/"});
// });
// this.route("fourOhFour", { path: "*:"});
// });
//wmarbut's workaround until his patch is applied
App.map_routes = [];
App.MapRoutes = function(routes) {
App.map_routes.push(routes);
return App.Router.map(function() {
var route_lamda, _i, _len, _ref;
_ref = App.map_routes;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
route_lamda = _ref[_i];
route_lamda.call(this);
}
return true;
});
};
//partial mapping
App.MapRoutes(function() {
this.resource("foods", function(){
});
});
//some more mapping
App.MapRoutes(function() {
this.resource("foods", function(){
this.route("index", {path: "/"});
});
});
//even more mapping
App.MapRoutes(function() {
this.route("fourOhFour", { path: "*:"});
});