From 7b74bf0cee9c398270353af01c4df05c9fdd0427 Mon Sep 17 00:00:00 2001 From: Ricardo Mendes Date: Mon, 27 Jan 2014 11:09:25 +0000 Subject: [PATCH] [FEATURE ember-routing-inherits-parent-model] Route inherits parent's model by default. --- FEATURES.md | 6 ++ features.json | 3 +- packages/ember-routing/lib/system/route.js | 14 ++- packages/ember/tests/routing/basic_test.js | 116 +++++++++++++++++++++ 4 files changed, 136 insertions(+), 3 deletions(-) diff --git a/FEATURES.md b/FEATURES.md index c69e9bdc478..5441e74591c 100644 --- a/FEATURES.md +++ b/FEATURES.md @@ -167,3 +167,9 @@ for a detailed explanation. underlying test framework to start/stop between async steps. Added in [#4176](https://github.com/emberjs/ember.js/pull/4176) + +* `ember-routing-inherits-parent-model` + + Ember routes and leaf resources (without nested routes) will inherit the parent route's model. + + Added in [#4246](https://github.com/emberjs/ember.js/pull/4246) diff --git a/features.json b/features.json index f4dacdebaa7..5fa4fb96876 100644 --- a/features.json +++ b/features.json @@ -20,7 +20,8 @@ "ember-eager-url-update": true, "ember-routing-auto-location": true, "ember-routing-bound-action-name": true, - "ember-runtime-test-friendly-promises": null + "ember-runtime-test-friendly-promises": null, + "ember-routing-inherits-parent-model": null }, "debugStatements": ["Ember.warn", "Ember.assert", "Ember.deprecate", "Ember.debug", "Ember.Logger.info"] } diff --git a/packages/ember-routing/lib/system/route.js b/packages/ember-routing/lib/system/route.js index e0e0bfdfb14..66ae18b1120 100644 --- a/packages/ember-routing/lib/system/route.js +++ b/packages/ember-routing/lib/system/route.js @@ -882,7 +882,17 @@ Ember.Route = Ember.Object.extend(Ember.ActionHandler, { } if (!name && sawParams) { return Ember.copy(params); } - else if (!name) { return; } + else if (!name) { + if (Ember.FEATURES.isEnabled("ember-routing-inherits-parent-model")) { + if (transition.resolveIndex !== transition.state.handlerInfos.length-1) { return; } + + var parentModel = transition.state.handlerInfos[transition.resolveIndex-1].context; + + return parentModel; + } else { + return; + } + } return this.findModel(name, value); }, @@ -1333,7 +1343,7 @@ Ember.Route = Ember.Object.extend(Ember.ActionHandler, { Alternatively, you can pass the `outlet` name directly as a string. Example: - + ```js hideModal: function(evt) { this.disconnectOutlet('modal'); diff --git a/packages/ember/tests/routing/basic_test.js b/packages/ember/tests/routing/basic_test.js index f6fdada2d2d..0335f06fafa 100644 --- a/packages/ember/tests/routing/basic_test.js +++ b/packages/ember/tests/routing/basic_test.js @@ -1469,6 +1469,122 @@ test("using replaceWith calls setURL if location.replaceURL is not defined", fun equal(router.get('location').getURL(), "/foo"); }); +if (Ember.FEATURES.isEnabled("ember-routing-inherits-parent-model")) { + test("Route inherits model from parent route", function() { + expect(9); + + Router.map(function() { + this.resource("the_post", { path: "/posts/:post_id" }, function() { + this.route("comments"); + + this.resource("shares", { path: "/shares/:share_id"}, function() { + this.route("share"); + }); + }); + }); + + var post1 = {}, post2 = {}, post3 = {}, currentPost; + var share1 = {}, share2 = {}, share3 = {}, currentShare; + + var posts = { + 1: post1, + 2: post2, + 3: post3 + }; + var shares = { + 1: share1, + 2: share2, + 3: share3 + }; + + App.ThePostRoute = Ember.Route.extend({ + model: function(params) { + return posts[params.post_id]; + } + }); + + App.ThePostCommentsRoute = Ember.Route.extend({ + afterModel: function(post, transition) { + var parent_model = this.modelFor('thePost'); + + equal(post, parent_model); + } + }); + + App.SharesRoute = Ember.Route.extend({ + model: function(params) { + return shares[params.share_id]; + } + }); + + App.SharesShareRoute = Ember.Route.extend({ + afterModel: function(share, transition) { + var parent_model = this.modelFor('shares'); + + equal(share, parent_model); + } + }); + + bootApplication(); + + currentPost = post1; + handleURL("/posts/1/comments"); + handleURL("/posts/1/shares/1"); + + currentPost = post2; + handleURL("/posts/2/comments"); + handleURL("/posts/2/shares/2"); + + currentPost = post3; + handleURL("/posts/3/comments"); + handleURL("/posts/3/shares/3"); + }); + + test("Resource does not inherit model from parent resource", function() { + expect(6); + + Router.map(function() { + this.resource("the_post", { path: "/posts/:post_id" }, function() { + this.resource("comments", function() { + }); + }); + }); + + var post1 = {}, post2 = {}, post3 = {}, currentPost; + + var posts = { + 1: post1, + 2: post2, + 3: post3 + }; + + App.ThePostRoute = Ember.Route.extend({ + model: function(params) { + return posts[params.post_id]; + } + }); + + App.CommentsRoute = Ember.Route.extend({ + afterModel: function(post, transition) { + var parent_model = this.modelFor('thePost'); + + notEqual(post, parent_model); + } + }); + + bootApplication(); + + currentPost = post1; + handleURL("/posts/1/comments"); + + currentPost = post2; + handleURL("/posts/2/comments"); + + currentPost = post3; + handleURL("/posts/3/comments"); + }); +} + test("It is possible to get the model from a parent route", function() { expect(9);