【问题标题】:Ember.js: Back button doesn't refresh index view when using nested routesEmber.js:使用嵌套路由时后退按钮不刷新索引视图
【发布时间】:2013-04-30 16:27:07
【问题描述】:

http://jsfiddle.net/bugsinamber/xjvYk/6/

设置

我有一个包含故事列表的索引视图。这被渲染到应用程序出口中。当我单击每个故事时,故事视图会呈现到同一个插座中(替换索引视图)。我正在使用嵌套路由。

问题

当我单击“所有故事”以从故事视图返回索引视图时,它工作正常。但如果点击浏览器返回按钮返回索引视图,路径会正确更改为“/stories”,但索引视图不会呈现。我必须再按一次后退按钮才能呈现索引视图。

模板

<script type="text/x-handlebars" data-template-name="application">
    {{outlet}}    
</script>

<script type="text/x-handlebars" data-template-name="stories">
    <p>Stories Index Page</p>    
    {{#each story in controller}}
    {{#linkTo "story"}}
    {{story.title}}
    {{/linkTo}}
    {{/each}}   
</script>

<script type="text/x-handlebars" data-template-name="story">
   {{#linkTo "index"}}Back to all stories{{/linkTo}}

   {{title}}    
    <p>Story test page</p>
</script>

app.js

App = Ember.Application.create({});

App.Router.map(function() {
    this.resource("stories", function() {
        this.resource("story", {path: ':story_id'});
    }); 
});

App.StoriesRoute = Ember.Route.extend({
  model: function() {
    return App.Story.find();   
  }
});

App.StoryRoute = Ember.Route.extend({
  model: function(params) {
    return App.Story.find(params.story_id);
  },  
  renderTemplate: function() {
      this.render('story', {   // the template to render
          into: 'application' // the template to render into
      });   
  }
});

App.IndexRoute = Ember.Route.extend({
  redirect: function() {
    this.transitionTo('stories');
  } 
});

到目前为止我所知道的

如果我不使用嵌套路由,这将正常工作。如果我不嵌套我的视图,显然我不应该使用嵌套路由,但这限制了设计需求。从逻辑上讲,在这种情况下,我应该被允许使用嵌套路由。

我正在嵌套路由,因为我需要从故事控制器访问“故事”,如下所示。如果我不嵌套路由,那么当我首先加载故事视图(尚未加载索引视图)时,“帖子”不会返回任何内容。

App.StoryController = Ember.ObjectController.extend({
    needs: "stories", 
    previousPost: function() {
        return this.advancePost(1);
    },
    nextPost: function() {
        return this.advancePost(-1);
    },
    advancePost: function(delta) {
        var index, length, posts;
        posts = this.get('controllers.stories');
        length = posts.get('length');
        index = (posts.indexOf(this.get('content')) + delta + length) % length;
        if (index >= 0 && index < length) {
            return this.transitionToRoute('story', posts.objectAt(index));
        }

    }
});

提前致谢。

【问题讨论】:

  • 你说过,它们不应该嵌套。限制设计是什么意思?您无需嵌套即可获得相同的结果,只是没有错误。此外,如果您删除嵌套,您也不会浪费不需要的 App.Store.find() 请求。
  • 嗨 Teddy,刚刚编辑了我的原始帖子,向您展示了我为什么要嵌套路线。请让我知道是否可以在不嵌套的情况下实现相同的效果。

标签: ember.js


【解决方案1】:

您的路线应该根据您的 UI 进行嵌套。 storiesstory 模板没有嵌套,所以这样做:

App.Router.map(function() {
  this.resource("stories");
  this.resource("story", { path: ':story_id' }); 
});

如果您希望story URL 包含stories,您可以这样做:

  this.resource("story", { path: 'stories/:story_id' }); 

接下来,您要访问App.StoryController 中的所有故事。这并不意味着它需要嵌套在stories 资源中,或者您需要使用App.StoriesController

你要访问数据,所以获取数据并设置在App.StoryController

App.StoryRoute = Ember.Route.extend({
  setupController: function(controller, model) {
    controller.setProperties({
      model: model,
      stories: App.Story.find()
    });
  },
  model: function(params) {
    return App.Story.find(params.story_id);
  }
});

并保持App.StoriesRoute 路由相同,作为与App.StoryRoute 无关的单独路由。

App.StoriesRoute = Ember.Route.extend({
  model: function() {
    return App.Story.find();   
  }
});

【讨论】:

  • 感谢 Teddy,无法弄清楚我需要在 Story 控制器中修改什么。 “posts = this.get('controllers.stories');”当索引视图尚未呈现时,仍然没有返回任何内容。我试过“posts = this.get('stories')”,但也没有用。再次感谢您。
  • posts = this.get('stories') 应该可以工作。我有一个错字,在App.StoryRoute setupController 中使用App.Story.find() 而不是App.Store.find()
  • 嗨,结果 this.get('stories') 的错误实际上来自我忘记注释掉的另一行。一切顺利,谢谢!
猜你喜欢
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
相关资源
最近更新 更多